1. ホーム
  2. python

[解決済み] ValueErrorです。複数の要素を持つ配列の真偽値は曖昧である。a.any()またはa.all()を使用する。

2022-01-28 23:41:48

質問

私のコードに論理的なバグが見つかり、様々な問題を引き起こしていました。私はうっかりして ビット単位のAND の代わりに 論理AND .

からコードを変更しました。

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

TO

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

驚いたことに、かなり不可解なエラーメッセージが表示されたのです。

ValueErrorです。複数の要素を持つ配列の真偽値は 曖昧です。a.any()またはa.all()を使用します。

ビット演算を使っても同様のエラーが発生しないのはなぜですか?

解決方法は?

r はnumpyの(rec)配列です。そのため r["dt"] >= startdate も(ブーリアン)である。 の配列です。numpyの配列の場合 & 演算は、2つの要素-アンドを返します。 ブーリアン配列です。

NumPyの開発者は、一般的に理解されている評価方法がないと感じていました。 を意味します。 True もし いずれか 要素が True を意味することもあれば True もし すべて 要素が True または True 配列の長さが0でない場合、3つの可能性があります。

ユーザーによってニーズや前提条件が異なる可能性があるため NumPyの開発者は、推測することを拒否し、代わりにValueErrorを発生させることにしました。 配列を評価しようとすると、必ずブーリアンコンテキストで評価されます。適用方法 and に 2つのnumpy配列は、2つの配列がブーリアンコンテキストで評価されるようになります。 呼び出し __bool__ Python3では __nonzero__ Python2の場合)。

あなたのオリジナルコード

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

は正しく見えます。しかし、もし and の代わりに a and b 使用 (a-b).any() または (a-b).all() .