2

我试图了解 numpy 的广播如何影响np.allclose.

>>> np.allclose([], [1.])
True

我不明白为什么会这样,但这不会:

>>> np.allclose([], [1., 2.])
ValueError: operands could not be broadcast together with shapes (0,) (2,)

这里有什么规则?我在numpy 文档中找不到任何关于空数组的内容。

4

2 回答 2

1

广播不会np.allclose以任何其他方式影响它,它会影响任何其他功能。

正如@cel 的评论,[1.]是维度 1,因此可以广播到任何其他维度,包括 0。另一方面[1., 2.]是维度 2,因此无法广播。

现在为什么allclose([],[1.]) == True?这实际上是有道理的:这意味着其中的所有元素[]都接近1.. 反之则意味着至少有一个元素与明显[]不接近,因为 in 中根本没有元素。1.False[]

另一种思考方式是问问自己你将如何实际编码allclose()

def allclose(array, target=1.):
    for x in array:
        if not isclose(x, target):
            return False
    return True

这将True在使用 调用时返回[]

于 2016-07-12T15:28:49.187 回答
1

广播规则也适用于加法,

In [7]: np.array([])+np.array([1.])
Out[7]: array([], dtype=float64)

In [8]: np.array([])+np.array([1.,2.])
....

ValueError: operands could not be broadcast together with shapes (0,) (2,)

让我们看看形状。

In [9]: np.array([]).shape,np.array([1.]).shape,np.array([1,2]).shape
Out[9]: ((0,), (1,), (2,))

(0,) 和 (1,) -(1,)可以调整以匹配其他数组的形状。可以1调整维度以匹配另一个数组,例如从 1 增加到 3。但这里(显然)从 1 调整到 0。我通常不使用 0 维度的数组,但这看起来像更高维度的适当概括。

尝试 (0,) 和 (1,1)。结果是 (1,0):

In [10]: np.array([])+np.array([[1.]])
Out[10]: array([], shape=(1, 0), dtype=float64)

(0,), (1,1) => (1,0),(1,1) => (1,0)

至于形状为 (0,) 和 (2,) 的第 2 种情况;没有任何尺寸 1 尺寸可以调整,因此会出现错误。

形状 (0,) 和 (2,1) 会广播(到 (2,0)):

In [12]: np.array([])+np.array([[1.,2]]).T
Out[12]: array([], shape=(2, 0), dtype=float64)
于 2016-07-12T17:45:25.363 回答