存储此占用最少内存的数组的方法是什么? uint8不起作用,因为某些值是负数,而int8不起作用,因为某些值大于127。int16可以工作,但我希望它占用更少的空间。
我不应该将其存储为numpy数组,而仅将其存储为常规python列表吗?
这是数组(如果您想让我知道整个数组,我仅包括前几行)
array([[[ 218, 219, 223],
[ 0, 0, 0],
[ 2, 2, 2],
[ 1, 1, 1],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ -3, -3, -3],
[ -1, -1, -1],
[ 0, 0, 0],
[ -1, -1, -1],
[ 0, 0, 0]]], dtype=int16)
我尝试过
import numpy as np
a = np.array([[[ 218, 219, 223],
[ 0, 0, 0],
[ 2, 2, 2],
[ 1, 1, 1],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ -3, -3, -3],
[ -1, -1, -1],
[ 0, 0, 0],
[ -1, -1, -1],
[ 0, 0, 0]]], dtype=np.int16)
signs = a<0.astype(np.bool)
a=a.astype(np.uint8)
但是发现它实际上比原始的(206字节)要差,而符号比167要差,而uint8数组比167要差。布尔值似乎和uint8一样多-经过仔细研究,我发现packbits最终将带您到某个地方-
signs2 = np.packbits(signs, axis=None)
尽管打包字节为106字节,但uint8 +符号仍然输给原始int16。这些大小由sys.getsizeof()报告。如果使用len(x.tostring()),则原始数组为78个字节,无符号8bit数组为39个字节,布尔符号为39个字节,打包符号为5个字节。