我正在寻找更紧凑的方式来存储布尔值。numpy 内部需要 8 位来存储一个布尔值,但np.packbits
允许打包它们,这很酷。
问题是要在一个4e6 字节数组中打包一个32e6 字节的布尔数组,我们首先需要花费256e6 字节来将布尔数组转换为 int 数组!
In [1]: db_bool = np.array(np.random.randint(2, size=(int(2e6), 16)), dtype=bool)
In [2]: db_int = np.asarray(db_bool, dtype=int)
In [3]: db_packed = np.packbits(db_int, axis=0)
In [4]: db.nbytes, db_int.nbytes, db_packed.nbytes
Out[5]: (32000000, 256000000, 4000000)
在 numpy 跟踪器中打开了一个一年前的问题(参见 https://github.com/numpy/numpy/issues/5377)
有人有解决方案/更好的解决方法吗?
当我们尝试以正确的方式进行操作时的回溯:
In [28]: db_pb = np.packbits(db_bool)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-28-3715e167166b> in <module>()
----> 1 db_pb = np.packbits(db_bool)
TypeError: Expected an input array of integer data type
In [29]:
PS:我会尝试一下 bitarray,但会在纯 numpy 中得到它。