使用==比较numpy数组的规则是什么?

yal*_*lis 5 python numpy numpy-broadcasting

例如,尝试理解这些结果:

>>> 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
>>> 
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?在[1]的情况下,它将1与x的每个元素进行比较,并将结果聚合在一个数组中.在[[1]]的情况下,同样的事情.只需在repl上进行试验,就可以很容易地找出特定阵列形状会发生什么.但是双方可以拥有任意形状的基本规则是什么?

unu*_*tbu 6

NumPy 尝试在比较之前将两个数组广播到兼容的形状。如果广播失败,当前返回 False。在未来

==如果广播或元素比较等失败,相等运算符将来会引发错误,例如 np.equal。

否则,返回由逐个元素比较产生的布尔数组。例如,由于xnp.array([1])是可广播的,因此返回形状为 (10,) 的数组:

In [49]: np.broadcast(x, np.array([1])).shape
Out[49]: (10,)
Run Code Online (Sandbox Code Playgroud)

由于xnp.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
Run Code Online (Sandbox Code Playgroud)