为什么带有dtype = object的numpy数组导致文件大小比dtype = int小得多?

Mup*_*pet 5 python numpy

这是一个例子:

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.

use*_*ica 7

对于非对象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个字节来进一步减小文件大小.