319

あらゆる種類の問題を引き起こしているコードの論理的なバグを発見しました。論理積の代わりにビット単位のANDを誤って実行していました。

コードを次のように変更しました:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

に:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]

驚いたことに、私はかなり不可解なエラーメッセージを受け取りました:

ValueError:複数の要素を持つ配列の真理値があいまいです。a.any()またはa.all()を使用します

ビット演算を使用したときに同様のエラーが発生しなかったのはなぜですか?これを修正するにはどうすればよいですか?

4

7 に答える 7

231

rnumpy(rec)配列です。(ブールr["dt"] >= startdate)配列も同様です。numpy配列の場合、&操作は要素ごとに、および2つのブール配列を返します。

NumPyの開発者は、ブール値のコンテキストで配列を評価する一般的に理解されている方法はないと感じていました。Trueつまり、要素がであるか、すべての要素 があるか、または配列の長さがゼロ以外であるかTrueを意味する可能性があります。可能性。TrueTrueTrue

ユーザーが異なればニーズや仮定も異なる可能性があるため、NumPy開発者は推測を拒否し、ブール値のコンテキストで配列を評価しようとするたびにValueErrorを発生させることにしました。2つのnumpy配列に適用するandと、2つの配列がブールコンテキストで評価されます(__bool__Python3またはPython2__nonzero__で呼び出すことにより)。

元のコード

mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

正しく見えます。ただし、必要な場合は、またはを使用するand代わりに。a and b(a-b).any()(a-b).all()

于 2012-04-08T13:08:01.283 に答える
72

I had the same problem (i.e. indexing with multi-conditions, here it's finding data in a certain date range). The (a-b).any() or (a-b).all() seem not working, at least for me.

Alternatively I found another solution which works perfectly for my desired functionality (The truth value of an array with more than one element is ambigous when trying to index an array).

Instead of using suggested code above, simply using a numpy.logical_and(a,b) would work. Here you may want to rewrite the code as

selected  = r[numpy.logical_and(r["dt"] >= startdate, r["dt"] <= enddate)]
于 2012-12-16T16:36:56.020 に答える