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

发布于 2021-01-29 18:03:37

例如,尝试理解以下结果:

>>> 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进行试验,就很容易弄清楚特定阵列形状会发生什么。但是,双方可以具有任意形状的基本规则是什么?

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

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

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

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看