我必须处理大数据(300乘4乘1400000整数数组),这是围绕
4byte * 300 * 4 * 1400000 = 6.72GB
但是,此数组只包含0或1.因此,如果我可以使用布尔数组,那么大小将缩小到原始数据的6.25%。
6.72GB / 4bytes / 8bits/bytes * 2 = 420Mbits
有没有办法在numpy中使用布尔数组?
修改 我不知道他为什么删除了他的答案,但这完全符合我的要求。
arr = np.ones((300,2,1400000), dtype = np.bool)
这会导致12.5%的压缩。
>>> arr = np.ones((300,2,1400000), dtype = np.bool)
>>> arr.nbytes
840000000
>>> arr = np.ones((300,2,1400000))
>>> arr.nbytes
6720000000
840000000/6720000000 = 12.5%
答案 0 :(得分:1)
虽然有一种方法可以操纵numpy中的“位字段”,但这些方法在位级别上没有提供正确的numpy数组的便利。
那就是说,numpy确实有“逻辑”或“布尔”数组,即带有dtype bool的数组。这些每个元素只占一个字节,并且是正确的数组。当您的数组由“逻辑数组操作”创建时,例如,b = (a > 0)
它(b
)将自动为bool类型。您可以通过标准的numpy方式获取布尔数组a.astype(bool),array(...,dtype = bool)等。
答案 1 :(得分:0)
这样可以减少75%,每个项目四个字节到每个项目一个字节。
bool_array = np.logical_and(int_array, True)