Ошибка довольно явная - предположим, у вас есть
x = np.array([1,2])
y = np.array([2,1])
, такой, что
(x>y) == np.array([0,1])
, что должно быть результатом вашего оператора if np.array([0,1])
?это правда или ложь?numpy
говорит вам, что это неоднозначно.Использование
(x>y).all()
или
(x>y).any()
является явным, и, таким образом, numpy
предлагает вам решения - либо любая пара ячеек удовлетворяет условию, либо все они - и однозначная истиназначение.Вы должны определить для себя, что именно вы имели в виду под вектор x больше, чем вектор y .
Решение numpy
для работы на всех парах x
и y
, таких какx[i]>y[j]
должен использовать сетку сетки для генерации всех пар:
>>> import numpy as np
>>> x=np.array(range(10))
>>> y=np.array(range(10))
>>> xv,yv=np.meshgrid(x,y)
>>> xv[xv>yv]
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 5, 6, 7, 8,
9, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, 8, 9, 7, 8, 9, 8, 9, 9])
>>> yv[xv>yv]
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8])
либо отправьте xv
и yv
на fun
, либо создайте сетку в функции, в зависимости от того, что делает большесмысл.Это генерирует все пары xi,yj
, такие что xi>yj
.Если вы хотите фактические индексы, просто верните xv>yv
, где каждая ячейка ij
соответствует x[i]
и y[j]
.В вашем случае:
def fun(x, y):
xv,yv=np.meshgrid(x,y)
return xv>yv
вернет матрицу, где fun(x,y)[i][j]
равно True, если x[i]>y[j]
, или False, в противном случае.В качестве альтернативы
return np.where(xv>yv)
вернет кортеж из двух массивов пар индексов, так что
for i,j in fun(x,y):
также будет гарантировать x[i]>y[j]
.