Каковы правила сравнения массивов с использованием ==?

Например, пытаясь понять эти результаты:

>>> 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

Возможно, вас смущает то, что:

  1. некоторое вещание продолжается.

  2. Похоже, у вас есть старая версия 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
Другие вопросы по тегам