2

バイナリ文字列 (0 と 1) を含む大きな Pandas データフレーム (ndarrayほとんどの目的で Numpy のサブクラス) があります。これらの文字列のすべてのゼロの位置を見つけて、それらにラベルを付ける必要があります。また、ゼロの位置が比較的まばらであると予想します(すべてのビット位置の約 1%)。

基本的に、私は次のようなものを実行したい:

import pandas as pd
x = pd.Series([ '11101110', '11111101' ], ) # start with strings
x = pd.Series([ 0b11101110, 0b11111101 ], ) # ... or integers of a known bit length

zero_positions = find_zero_positions( x )

降伏zero_positions =中 ...

         value
row bit
0   4        0
    0        0
1   1        0

これを行うためにいくつかの異なる方法を試しましたが、一度に 1 行ずつループするよりも良い方法は思いつきませんでした。(編集:見たい実際の文字列は、ここにある 8 ビットの例よりもはるかに長いため、ルックアップ テーブルは機能しません。)

これを文字列の問題 (Pandas のベクトル化された文字列メソッドは部分文字列の位置検出方法を提供していません) としてアプローチする方が効率的か、数値の問題 ( のようなものを使用してnumpy.unpackbits、多分?) としてアプローチする方が効率的かどうかはわかりません。

4

4 に答える 4

2

numpy.unpackbitsこの形式の ndarray から始めて、次のように使用できます。

In [1]: x = np.array([[0b11101110], [0b11111101]], dtype=np.uint8)

In [2]: x
Out[2]:
array([[238],
       [253]], dtype=uint8)

In [3]: df = pd.DataFrame(np.unpackbits(x, axis=1))

In [4]: df.columns = df.columns[::-1]

In [5]: df
Out[5]:
   7  6  5  4  3  2  1  0
0  1  1  1  0  1  1  1  0
1  1  1  1  1  1  1  0  1

次に、DataFrame からstackゼロを見つけます。

In [6]: s = df.stack()

In [7]: s.index.names = ['row', 'bit']

In [8]: s[s == 0]
Out[8]:
row  bit
0    4      0
     0      0
1    1      0
dtype: uint8

これはかなり効率的な方法だと思います。

于 2013-06-11T00:35:02.123 に答える