2017-03-20 9 views
0

に依存して私は、バイナリデータを読み取るためのmemmapを持っている(> 1000年>> 1000個のファイルがそれぞれを記録)numpyのmemmapでカウント、基準は二つのフィールド

f = np.memmap('data.dat', dtype= myFormat, mode= 'r') 

と応じた条件を満足するレコードをカウントする方法を知っています(myFormatの 'ステータス' という名前の)単一のフィールドに:

eval = f['Status'] & 0x20 == 0x20 
    nNotEval = np.count_nonzero(eval == False) 

別のフィールドは、evalの上で条件付きで使用されます。

v = calibration * f['V'][eval] 

今、要素的に2つの条件を結合する方法は?次failes:「複数の要素を持つ配列の真理値があいまいである」と「使用a.any()またはa.allを()」を示しているが、それが何でない

unexpected = (f['Status'] & 0x02 == 0) and (v > 15.) 

Pythonの抗議私が必要です

nUnexpected = np.count_nonzero(unexpected) 

私は反復する必要がありますか?もしそうなら、構文はどうですか? for (a,b) in ...のようなもの?

答えて

1

これはmemmap号ではなく、count_nonzeroでもあります。これは、化合物のブーリアン演算を行うことについてです:

unexpected = (f['Status'] & 0x02 == 0) and (v > 15.) 

これは、より良い動作するはず:

unexpected = (f['Status'] & 0x02 == 0) & (v > 15.) 

andは、Pythonスカラ演算(短絡)です。しかし、あなたの式はブール値の配列を生成します。あなたはそれらに参加するために&を使用する必要があります。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() python(複製?)

+0

ありがとうございました。 &私のために働く。そして、私はSOを逐語的なエラーメッセージのために探していたはずです。 – Rainald62

+0

申し訳ありませんが、私は適切なテストの前に答えを受け入れました。 &が1つのケースで動作しましたが、次のエラーメッセージが表示されます:ValueError:オペランドを図形(682、)(674、)と一緒にブロードキャストできませんでした。 – Rainald62

+0

682は 'e 'の' f [' Status ']と '0x02 == 0'の' len'と 'f [' V ']'の 'len'です。長さは操作f ['V'] [eval] 'で674になります。 – Rainald62

関連する問題