【问题标题】:What are the rules for comparing numpy arrays using ==?使用 == 比较 numpy 数组的规则是什么?
【发布时间】:2016-02-14 20:47:57
【问题描述】:

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

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

【问题讨论】:

  • Ppl 应该问像 yalis 这样的问题。有好的、详尽的例子。

标签: python numpy array-broadcasting


【解决方案1】:

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

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

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

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

由于xnp.array([[1,3],[2]]) 不可广播,Falsex == 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

【讨论】:

  • 值得注意的是,正如this question 中所述,从 1.14.1 开始,已弃用的行为仍未被删除。因此,大概,直到将来某个更远的时间点,如果似乎有可能获得MemoryError,您需要小心调用np.equal 而不是==
【解决方案2】:

让你感到困惑的可能是:

  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

【讨论】:

    【解决方案3】:

    添加到 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
    

    【讨论】:

    • 这些代表什么比较? A 和 B 如何与结果相关?只是有点混淆模式是什么。
    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2016-08-30
    • 1970-01-01
    • 2022-06-10
    • 2013-05-09
    相关资源
    最近更新 更多