web-dev-qa-db-ja.com

配列にインデックスを付けようとすると、複数の要素を持つ配列の真理値があいまいです

Var(another numpy array)の要素が> = 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)]

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

16
Rtrader

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

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番目または1番目の要素を取得します。あなたが望むものではありません。

推測できるように、インデックス付けに2つのブール配列aまたはbを使用する場合は、aまたはbのいずれかの項目を選択します本当です、あなたは使うでしょう

c[np.logical_or(a,b)]

または

c[a | b]
30
Pierre GM

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

>>> 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に置き換えることです。これはnp.boolの2つの配列でAND演算をブロードキャストします。

>>> 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])
9
Fred Foo
# draw the previous original bounding boxes
if rectsPersist != None:
    for (x, y, w, h) in rectsPersist:
        cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)

# draw the previous final bounding boxes
if pickPersist != None:
    for (xA, yA, xB, yB) in pickPersist:
        cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)

if not count % 1:
    count = 0
    image = imutils.resize(image, width=min(700, image.shape[1]))

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

0
Neelu