2016-02-14 5 views
5

Например, пытаясь понять смысл этих результатов:Каковы правила сравнения массивов numpy с использованием ==?

>>> 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. Но каковы основные правила, в которых обе стороны могут иметь произвольные формы?

ответ

4

NumPy пытается передать два массива совместимым формам перед сравнением. Если трансляция не удалась, в настоящее время возвращается False. In the future,

Равенство оператор == будет в будущем вызывать ошибки как np.equal Если передача в эфир или элемент сравнения и т.д. не удается.

В противном случае возвращается логический массив, полученный в результате сравнения элементов по элементу. Например, так как x и np.array([1]) являются broadcastable, массив формы (10,) возвращается:

In [49]: np.broadcast(x, np.array([1])).shape 
Out[49]: (10,) 

С x и np.array([[1,3],[2]]) не broadcastable, 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 
3

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

  1. некоторые broadcasting происходит.

  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