如何在 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 中创建布尔数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在numpy中创建一个连续数字数组?

如何在 NumPy 中创建一个空数组/矩阵?

如何在 NumPy 数组中创建索引列?

如何在 C++ 中创建类似于 Python 的 numpy 数组的数组?

如何在 Java 中创建锯齿状二维数组?

如何在python numpy中创建随机正交矩阵