ブール値を格納するよりコンパクトな方法を探しています。numpy は、1 つのブール値を格納するために内部的に 8 ビットを必要としますが、np.packbits
それらをパックできるようにします。これはかなりクールです。
問題は、ブール値の32e6 バイト配列を 4e6 バイト配列にパックするには、最初に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 トラッカーで開かれた 1 年前の問題があります ( 参照 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 で取得する必要があります。