使用 == 比较 numpy 数组的规则是什么?
What are the rules for comparing numpy arrays using ==?
例如,试图理解这些结果:
>>> 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 上进行试验,就可以很容易地弄清楚特定阵列形状会发生什么。但是双方可以有任意形状的基本规则是什么?
NumPy 在比较之前尝试将两个数组广播到兼容的形状。
如果广播失败,当前返回 False。 In the future、
The equality operator ==
will in the future raise errors like
np.equal if broadcasting or element comparisons, etc. fails.
否则,返回逐个元素比较得到的布尔数组。例如,由于 x
和 np.array([1])
是可广播的,因此返回一个形状为 (10,) 的数组:
In [49]: np.broadcast(x, np.array([1])).shape
Out[49]: (10,)
由于 x
和 np.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
可能让您感到困惑的是:
一些 broadcasting 正在进行中。
你似乎有一个旧版本的 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
添加到 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
例如,试图理解这些结果:
>>> 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 上进行试验,就可以很容易地弄清楚特定阵列形状会发生什么。但是双方可以有任意形状的基本规则是什么?
NumPy 在比较之前尝试将两个数组广播到兼容的形状。 如果广播失败,当前返回 False。 In the future、
The equality operator
==
will in the future raise errors like np.equal if broadcasting or element comparisons, etc. fails.
否则,返回逐个元素比较得到的布尔数组。例如,由于 x
和 np.array([1])
是可广播的,因此返回一个形状为 (10,) 的数组:
In [49]: np.broadcast(x, np.array([1])).shape
Out[49]: (10,)
由于 x
和 np.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
可能让您感到困惑的是:
一些 broadcasting 正在进行中。
你似乎有一个旧版本的 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
添加到 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