yalis - 1 year ago 71

Python Question

For example, trying to make sense of these results:

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

>>>

What's going on here? In the case of [1], it's comparing 1 to each element of x and aggregating the result in an array. In the case of [[1]], same thing. It's easy to figure out what's going to occur for specific array shapes by just experimenting on the repl. But what are the underlying rules where both sides can have arbitrary shapes?

Answer Source

NumPy tries to broadcast the two arrays to compatible shapes before comparison. If the broadcasting fails, False is currently returned. In the future,

The equality operator

`==`

will in the future raise errors like np.equal if broadcasting or element comparisons, etc. fails.

Otherwise, a boolean array resulting from the element-by-element comparison is returned. For example, since `x`

and `np.array([1])`

are broadcastable, an array of shape (10,) is returned:

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

Since `x`

and `np.array([[1,3],[2]])`

are not broadcastable, `False`

is returned by `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
```