如何在 numpy 中创建布尔数组
Posted
技术标签:
【中文标题】如何在 numpy 中创建布尔数组【英文标题】:How to create a Boolean array in numpy 【发布时间】:2017-02-10 17:16:34 【问题描述】:我必须处理一个大数据(300 x 4 x 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 ......每个元素有 2 位" - 呃,什么?如何用 2 位来表示? 【参考方案1】:虽然有一种方法可以在 numpy 中操作“位字段”,但这些方法无法在位级别上提供适当的 numpy 数组的便利。
也就是说,numpy 确实有“逻辑”或“布尔”数组,即 dtype 为 bool 的数组。它们每个元素只占用一个字节,并且是正确的数组。当您的数组由“逻辑数组操作”创建时,例如b = (a > 0)
,它 (b
) 将自动为 bool 类型。您可以通过标准 numpy 方式 a.astype(bool)、array(..., dtype=bool) 等获取布尔数组。
【讨论】:
谢谢。我使用 h5py 从 .mat 数据文件加载数组。似乎即使数据只包含 0 和 1,我也得到了整数数组。所以我将使用 dtype = np.bool 参数将其转换为 bool 数组。 @takataka 我认为 hdf5 使用或能够使用压缩,这将大大改善浪费。不确定“matlab-hdf5”到底是做什么的。不管怎样,我觉得你的计划不错。【参考方案2】:这将使您减少 75%,从每个项目 4 个字节到每个项目一个字节。
bool_array = np.logical_and(int_array, True)
【讨论】:
以上是关于如何在 numpy 中创建布尔数组的主要内容,如果未能解决你的问题,请参考以下文章