Да, если вы используете данные типа с плавающей запятой, это определенно так.
Вы можете попробовать numpy.savez_compressed
сохранить как сжатый массив.
ref: https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez_compressed.html
Вы также можете использовать gzip
, но алгоритм сжатия важен.
import gzip
import numpy
f = gzip.GzipFile("x.npy.gz", "w")
numpy.save(file=f, arr=x)
f.close()
это может быть полезно: Сжатие numpy Массивы эффективно
Для двоичных данных
uint8
кажется большой тратой. Фактически, вы можете хранить 8 значений (0/1) в одном
uin8
. Просто считайте 0, 1 битами, и вы можете кодировать 8 бит в одном
uint8
с помощью простых двоичных операций.
Вы можете использовать «логическое значение» для хранения значений 0/1.
import numpy as np
import sys
b = np.array([0, 1, 0]*50000, dtype='b')
print(sys.getsizeof(b))
u8 = np.array([0, 1, 0]*50000, dtype='u8')
print(sys.getsizeof(u8))
150096
1200096
Да, определенно. Если вы рассматриваете сжатие с потерями как вариант, вы можете сжать массив с хорошим коэффициентом.
Не имеет значения, важны только форма и типы данных. Numpy массивы не сжимаются. Если вы сравните его с изображениями - это было бы неправильно, аналогия типа «черное изображение имеет меньший размер из-за однородности, поэтому массивы с нулевой подкладкой должны занимать меньше места» - не имеет значения (изображения обычно сжимают JPEG с потерями).