具有1位条目的numpy布尔数组

And*_*nca 31 python boolean numpy

有没有办法在numpy中创建一个布尔数组,每个条目只使用1位?

标准np.bool类型是1个字节,但这样我使用所需内存的8倍.

在谷歌上我发现C++有std::vector<bool>.

Chr*_*rle 18

你想要一个比特币:

有效的布尔数组 - C扩展

该模块提供了一种有效表示布尔数组的对象类型.Bitarrays是序列类型,其行为与通常列表非常相似.八个位由连续的存储器块中的一个字节表示.用户可以在两种表示之间进行选择; little-endian和big-endian.所有功能都在C中实现.提供了用于访问机器表示的方法.当需要对二进制文件进行位级访问时,这可能很有用,例如便携式位图图像文件(.pbm).此外,在处理使用可变位长编码的压缩数据时,您可能会发现此模块很有用......

  • 将此 bityarray 转换回 numpy 数组是否容易?你能添加一个小例子来证明这一点吗? (2认同)

Sal*_*ali 15

为此,您可以使用numpy的本机packbitsunpackbits.第一个功能是直接使用,但要重建,您将需要额外的操作.这是一个例子:

import numpy as np
# original boolean array
A1 = np.array([
    [0, 1, 1, 0, 1],
    [0, 0, 1, 1, 1],
    [1, 1, 1, 1, 1],
], dtype=np.bool)

# packed data
A2 = np.packbits(A1, axis=None)

# checking the size
print len(A1.tostring()) # 15 bytes
print len(A2.tostring()) #  2 bytes (ceil(15/8))

# reconstructing from packed data. You need to resize and reshape
A3 = np.unpackbits(A2, axis=None)[:A1.size].reshape(A1.shape).astype(np.bool)

# and the arrays are equal
print np.array_equal(A1, A3) # True
Run Code Online (Sandbox Code Playgroud)

  • 这里唯一的问题是压缩数组意味着在内存中同时包含压缩和未压缩的数组,但有时你根本没有足够的内存来包含更大的数组,这就是你想要使用打包格式的原因 (3认同)
  • 正如附录一样,我正在努力改进这个答案:https://github.com/numpy/numpy/pull/10855.目标是使packbits和unpackbits完全可逆,而无需重新整形. (2认同)
  • @MadPhysicist 这会很棒。感谢您这样做。完成后,请写下您自己的答案或编辑我的答案。 (2认同)
  • @SalvadorDali 似乎是 PR [成功掌握](https://github.com/numpy/numpy/commit/269d9855216e7c66708b1e2c6f5da7e5f39c70c1) (2认同)

Sco*_*ths 12

您可能想看看bitstring(这里的文档).

如果您创建一个ConstBitArrayConstBitStream一个文件,它将使用mmap而不是将其加载到内存中.在这种情况下,它不会是可变的,所以如果你想进行更改,它必须加载到内存中.

例如,无需加载到内存中即可创建:

>>> a = bitstring.ConstBitArray(filename='your_file')
Run Code Online (Sandbox Code Playgroud)

要么

>>> b = bitstring.ConstBitStream(a_file_object)
Run Code Online (Sandbox Code Playgroud)