Логическое выражение создает ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()

При запуске следующего кода я получаю сообщение об ошибке «ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()»

import random
import numpy as np

nx, ny = (32, 32)
xaxis = np.linspace(-310, 310, nx)
yaxis = np.linspace(-310, 310, ny)
xys = np.dstack(np.meshgrid(xaxis, yaxis)).reshape(-1, 2)

oris = random.randint (0, 180)
random_ori=oris

absX = abs(xys[:,0])
absY = abs(xys[:,1])

x_rand=(random.randint (0, 220))
y_rand=(random.randint (0, 220))

width=40
height=80

patch = (x_rand <= absX < x_rand + width) * (y_rand <= absY < y_rand + height)
oris[patch] = random_ori + 30 

Проблема, кажется, связана с логическим выражением:

patch = (x_rand <= absX < x_rand + width) * (y_rand <= absY < y_rand + height)

Как следует из сообщения об ошибке, я пытался использовать .any() и .all(), но появляется то же сообщение об ошибке.

Я не могу использовать np.logical_and или np.logical_or, так как я не работаю с массивом numpy.

Кто-нибудь знает, почему .any() и .all() не решают проблему, и что я могу сделать, чтобы это исправить?

Спасибо.


person Cashel Godfrey    schedule 25.07.2016    source источник


Ответы (1)


Я думаю, ваша проблема в том, что у absX есть куча чисел, а x_rand+width — только одно. Ваш x_rand ‹= absX возвращает массив. Примените к этому np.all (или любой другой), а затем проверьте x_rand + width, например. np.all(x_rand <= absX) < x_rand+width.

person brittAnderson    schedule 25.07.2016
comment
Спасибо за это @brittUWaterloo, но когда я это использую, на выходе получается только одно логическое значение. Мне нужны истинные значения для absX и absY, соответствующие критериям, и ложные для остальных. В результате я должен получить несколько ложных и истинных значений для всех 1024 элементов. [Мне нужны эти множественные значения false/true, чтобы позже я мог установить ориентацию элементов, соответствующих критериям исправления. - person Cashel Godfrey; 26.07.2016
comment
Если вам просто нужны значения, попробуйте понимание списка, например [x for x in absX if x >= x_rand and x < x_rand + width] - person brittAnderson; 26.07.2016