NumPy广播不起作用

时间:2015-06-06 14:09:22

标签: python arrays numpy numpy-broadcasting

我试图播放两个向量之间的差异。这适用于这样一个简单的案例:

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]]]

1 个答案:

答案 0 :(得分:6)

在这种情况下,您需要在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