20

var(別の numpy 配列) の要素が >=0 および <=.1 の場合、rbs のすべての要素を新しい配列に入れようとしています。ただし、次のコードを試すと、このエラーが発生します。

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

rbs = [ish[4] for ish in realbooks]
for book in realbooks:
    var -= float(str(book[0]).replace(":", ""))
    bidsred = rbs[(var <= .1) and (var >=0)]

私が間違っていることについてのアイデアはありますか?

4

3 に答える 3

34

以前の回答へのコメントで説明したように、次のいずれかを使用する必要があります。

c[a & b]

また

c[np.logical_and(a, b)] 

その理由は、このandキーワードが Python で 2 つのブール値をテストするために使用されるためです。配列をブール値にするにはどうすればよいですか? そのアイテムの 75% が である場合True、それはTrueですかFalse? したがって、numpy は 2 つの比較を拒否します。

そのため、論理関数を使用して 2 つのブール配列を要素ごとに比較するか ( np.logical_and)、または二項演算子を使用する必要があり&ます。

さらに、インデックス付けの目的で、インデックス付けする配列と同じサイズのブール配列が本当に必要です。代わりにリストを使用することはできません。理由は、ブール配列を使用するとTrue/False、返す要素を NumPy に伝えるためです。のリストを使用する場合True/False、NumPy はそれを整数のリスト、つまりインデックスとして解釈し1/0ます。つまり、配列の 2 番目または最初の要素を取得することを意味します。あなたが望むものではありません。

ご想像のとおり、2 つのブール配列を使用する場合、aまたはbインデックス付けのために、aまたはbが True である項目を選択する場合は、次のようにします。

c[np.logical_or(a,b)]

また

c[a | b]
于 2012-09-28T21:22:52.380 に答える
13

通常、Numpy 配列を含む比較式でPython ブール演算子 ( notand、 )を使用しようとすると、このエラー メッセージが表示されます。or

>>> x = np.arange(-5, 5)
>>> (x > -2) and (x < 2)
Traceback (most recent call last):
  File "<ipython-input-6-475a0a26e11c>", line 1, in <module>
    (x > -2) and (x < 2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

これは、このような比較は、Python の他の比較とは対照的に、単一のブール値ではなくブール値の配列を作成するためです (ただし、既にご存知かもしれません)。

>>> x > -2
array([False, False, False, False,  True,  True,  True,  True,  True,  True], dtype=bool)
>>> x < 2
array([ True,  True,  True,  True,  True,  True,  True, False, False, False], dtype=bool)

問題の解決策の一部は、おそらく に置き換える必要がありますandnp.logical_andこれは、 AND 演算を の 2 つの配列にブロードキャストしますnp.bool

>>> np.logical_and(x > -2, x < 2)
array([False, False, False, False,  True,  True,  True, False, False, False], dtype=bool)
>>> x[np.logical_and(x > -2, x < 2)]
array([-1,  0,  1])

ただし、そのようなブール値の配列は、通常の Python リストへのインデックス付けには使用できないため、配列に変換する必要があります。

rbs = np.array([ish[4] for ish in realbooks])
于 2012-09-28T21:21:38.340 に答える