NumPy 广播不起作用

NumPy broadcasting doesn't work

我正在尝试传播两个向量之间的差异。这适用于像这样的简单情况:

In[1] : data = np.array([1,2])
In[2] : centers = np.array([[2,2],[3,3]])

In[3] : data - center

Out[3] : array([[-1,  0],
               [-2, -1]])

但是当我尝试做同样的事情但尺寸更大时,这将不起作用

In [4]: data = np.array([[1,2],[3,4],[6,7]])
In [5]: data
Out [5]: array([[1,2],
                [3,4],
                [6,7]])

In [6]: centers = np.array([[2,2],[3,3]])
In [7]: centers
Out [7]: array([[2,2],
                [3,3]])

我想执行 data - centers 这样我就可以得到输出:

array([[[-1,0],
        [-2,-1]],
       [[1,2],
        [0,1]],
       [[4,5],
        [3,4]]]

在这种情况下,您需要在 data 中插入一个额外的轴:

>>> data[:, None] - centers
array([[[-1,  0],
        [-2, -1]],

       [[ 1,  2],
        [ 0,  1]],

       [[ 4,  5],
        [ 3,  4]]])

原来data.shape(3, 2)centers.shape(2, 2)。 NumPy 无法一起广播具有这些形状的数组,因为第一个轴的长度不兼容(它们需要相同的长度,或者其中一个需要 1)。

插入额外维度,data[:, None] 具有形状 (3, 1, 2),然后轴的长度正确对齐:

(3, 1, 2) 
   (2, 2) 
    #  #
    #  # lengths are equal for this axis
    #
    # 1 is compatible with any length