这是一个例子:
import numpy as np
randoms = np.random.randint(0, 20, 10000000)
a = randoms.astype(np.int)
b = randoms.astype(np.object)
np.save('d:/dtype=int.npy', a) #39 mb
np.save('d:/dtype=object.npy', b) #19 mb!
Run Code Online (Sandbox Code Playgroud)
您可以看到dtype = object的文件大小只有一半.怎么会?我的印象是,正确定义的numpy dtypes严格地优于对象dtypes.
对于非对象dtype,大多数npy文件格式包含数组原始字节数据的转储.这里每个元素要么是4个或8个字节,这取决于你的NumPy默认是4个还是8个字节的整数.从文件大小来看,每个元素看起来像4个字节.
使用对象dtype,大多数npy文件格式由数组的普通pickle组成.对于小整数,例如数组中的小整数,pickle使用Kpickle操作码,长名称BININT1,在pickletools模块中"记录" :
I(name='BININT1',
code='K',
arg=uint1,
stack_before=[],
stack_after=[pyint],
proto=1,
doc="""Push a one-byte unsigned integer.
This is a space optimization for pickling very small non-negative ints,
in range(256).
"""),
Run Code Online (Sandbox Code Playgroud)
这需要每个整数两个字节,一个用于K操作码,一个字节用于无符号整数数据.
请注意,您可以通过将数组存储为dtype numpy.int8或者numpy.uint8每个整数大约1个字节来进一步减小文件大小.