Очевидно, что в вашем файле «raw1.raw» должно быть больше данных, которые вы не используете. Вы уверены, что этот файл не был создан с использованием данных «uint16», и вы просто извлекаете первую половину как данные «uint8»? Только что проверил запись случайных данных.
import os, numpy as np
x = np.random.randint(0,256,size=(3000,5100),dtype='uint8')
x.tofile(open('testfile.raw','w'))
print(os.stat('testfile.raw').st_size) #I get 15.3MB.
Таким образом, «uint8» для 3000 на 5100 явно занимает 15,3 МБ. Я не знаю, как вы получили 30+.
############################ РЕДАКТИРОВАТЬ #########
Просто чтобы добавить больше разъяснений. Вы понимаете, что dtype не делает ничего, кроме изменения представления ваших данных? Это не влияет на фактические данные, которые сохраняются в памяти. Это также относится к данным, которые вы читаете из файла. Возьмем, к примеру:
import numpy as np
#The way to understand x, is that x is taking 12 bytes in memory and using
#that information to hold 3 values. The first 4 bytes are the first value,
#the second 4 bytes are the second, etc.
x = np.array([1,2,3],dtype='uint32')
#Change x to display those 12 bytes at 6 different values. Doing this does
#NOT change the data that the array is holding. You are only changing the
#'view' of the data.
x.dtype = 'uint16'
print(x)
В общем (есть несколько особых случаев) изменение dtype не меняет базовые данные. Однако функция преобразования .astype() изменяет базовые данные. Если у вас есть какой-либо массив из 12 байтов, рассматриваемый как «int32», то запуск .astype('uint8') возьмет каждую запись (4 байта) и скроет ее (известную как приведение) к записи uint8 (1 байт). Новый массив будет иметь только 3 байта для 3 записей. Вы можете увидеть это буквально:
x = np.array([1,2,3],dtype='uint32')
print(x.tobytes())
y = x.astype('uint8')
print(y.tobytes())
Таким образом, когда мы говорим, что размер файла составляет 30 МБ, мы имеем в виду, что размер файла (за вычетом некоторой информации в заголовке) составляет 30 000 000 байтов, что равно uint8. 1 uint8 — это 1 байт. Если какой-либо массив имеет 6000x5100 uint8s (байт), то массив имеет 30 600 000 байт информации в памяти.
Аналогично, если вы читаете файл (НЕ ИМЕЕТ ВАЖНОГО ФАЙЛА) и пишете np.fromfile(,dtype=np.uint8,count=15_300_000), то вы говорите python читать ТОЧНО 15_300_000 байтов (опять же 1 байт равен 1 uint8) информации (15мб). Если ваш файл имеет размер 100 МБ, 40 МБ или даже 30 МБ, это будет совершенно неважно, потому что вы сказали python читать только первые 15 МБ данных.
person
Bobby Ocean
schedule
11.02.2021
im = I_array[24:,:]
, чтобы отрезать первые 24 строки. - person mtrw   schedule 11.02.2021