Каковы правила сравнения массивов с использованием ==?
Например, пытаясь понять эти результаты:
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> (x == np.array([[1],[2]])).astype(np.float32)
array([[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
>>> (x == np.array([1,2]))
False
>>> (x == np.array([[1]])).astype(np.float32)
array([[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
>>> (x == np.array([1])).astype(np.float32)
array([ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)
>>> (x == np.array([[1,3],[2]]))
False
>>>
Что тут происходит? В случае [1] он сравнивает 1 с каждым элементом x и объединяет результат в массив. В случае [[1]] то же самое. Легко понять, что произойдет с определенными формами массива, просто экспериментируя с repl. Но каковы основные правила, когда обе стороны могут иметь произвольные формы?
2 ответа
NumPy пытается сопоставить два массива до совместимых форм перед сравнением. Если трансляция не удалась, False в настоящее время возвращается. В будущем
Оператор равенства
==
в будущем вызовет ошибки типа np.equal, если трансляция или сравнение элементов и т. д. не удастся.
В противном случае возвращается логический массив, полученный в результате поэлементного сравнения. Например, так как x
а также np.array([1])
являются трансляционными, возвращается массив shape (10,):
In [49]: np.broadcast(x, np.array([1])).shape
Out[49]: (10,)
поскольку x
а также np.array([[1,3],[2]])
не транслируются, False
возвращается x == np.array([[1,3],[2]])
,
In [50]: np.broadcast(x, np.array([[1,3],[2]])).shape
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-50-56e4868cd7f7> in <module>()
----> 1 np.broadcast(x, np.array([[1,3],[2]])).shape
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Возможно, вас смущает то, что:
некоторое вещание продолжается.
Похоже, у вас есть старая версия NumPy.
x == np.array([[1],[2]])
вещает. Это сравнивает x
каждому из первого и второго массивов; поскольку они являются скалярами, радиовещание подразумевает, что оно сравнивает каждый элемент x
каждому из скаляров.
Тем не менее, каждый из
x == np.array([1,2])
а также
x == np.array([[1,3],[2]])
не может быть передано. Мной, с numpy
1.10.4, это дает
/usr/local/bin/ipython:1: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future.
#!/usr/bin/python
False
В дополнение к ответу unutbu, массивы не обязательно должны иметь одинаковое количество измерений. Например, размеры с размером 1 растягиваются, чтобы соответствовать другому.
A (4d array): 8 x 1 x 6 x 1
B (3d array): 7 x 1 x 5
Result (4d array): 8 x 7 x 6 x 5
A (2d array): 5 x 4
B (1d array): 1
Result (2d array): 5 x 4
A (2d array): 5 x 4
B (1d array): 4
Result (2d array): 5 x 4
A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 1
Result (3d array): 15 x 3 x 5