15

Convert binary (0|1) numpy array to integer or binary-string へのショートカットはありますか? フェ

b = np.array([0,0,0,0,0,1,0,1])   
  => b is 5

np.packbits(b)

動作しますが、8ビット値に対してのみ..numpyが9つ以上の要素である場合、2つ以上の8ビット値が生成されます。別のオプションは、0|1 の文字列を返すことです ...

私が現在行っていることは次のとおりです。

    ba = bitarray()
    ba.pack(b.astype(np.bool).tostring())
    #convert from bitarray 0|1 to integer
    result = int( ba.to01(), 2 )

これは醜いです!!!

4

5 に答える 5

22

1つの方法は、範囲配列で使用dot-productすることです-2-powered

b.dot(2**np.arange(b.size)[::-1])

サンプルラン -

In [95]: b = np.array([1,0,1,0,0,0,0,0,1,0,1])

In [96]: b.dot(2**np.arange(b.size)[::-1])
Out[96]: 1285

または、ビットごとの左シフト演算子を使用して範囲配列を作成し、次のように目的の出力を取得することもできます-

b.dot(1 << np.arange(b.size)[::-1])

タイミングが重要な場合 -

In [148]: b = np.random.randint(0,2,(50))

In [149]: %timeit b.dot(2**np.arange(b.size)[::-1])
100000 loops, best of 3: 13.1 µs per loop

In [150]: %timeit b.dot(1 << np.arange(b.size)[::-1])
100000 loops, best of 3: 7.92 µs per loop

逆工程

np.binary_reprバイナリ配列を取得するには、np.fromstring-とともに使用します。

In [96]: b = np.array([1,0,1,0,0,0,0,0,1,0,1])

In [97]: num = b.dot(2**np.arange(b.size)[::-1]) # integer

In [98]: np.fromstring(np.binary_repr(num), dtype='S1').astype(int)
Out[98]: array([1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1])
于 2016-12-09T22:38:31.270 に答える