代码之家  ›  专栏  ›  技术社区  ›  Alex

使用3d阵列的numpy广播

  •  0
  • Alex  · 技术社区  · 7 年前

    x=np.arange(3)[:,np.newaxis]
    y=np.arange(3)
    x+y=
    array([[0, 1, 2],
           [1, 2, 3],
           [2, 3, 4]])
    

    对于类似于以下矩阵的三维矩阵,使得[i]中的每个元素被视为1D向量,如上例所示?

    a=np.zeros((2,2,2))
    a[0]=1
    b=a
    result=a+b
    

    导致

    result[0,0]=array([[2, 2],
                       [2, 2]])
    
    result[0,1]=array([[1, 1],
                       [1, 1]])
    
    result[1,0]=array([[1, 1],
                       [1, 1]])
    
    result[1,1]=array([[0, 0],
                       [0, 0]])
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   akuiper    7 年前

    可以按照与1d阵列相同的方式执行此操作,即在轴0和轴1之间插入一个新轴 a b

    a + b[:,None]    # or a[:,None] + b
    

    (a + b[:,None])[0,0]
    #array([[ 2.,  2.],
    #       [ 2.,  2.]])
    
    (a + b[:,None])[0,1]
    #array([[ 1.,  1.],
    #       [ 1.,  1.]])
    
    (a + b[:,None])[1,0]
    #array([[ 1.,  1.],
    #       [ 1.,  1.]])
    
    (a + b[:,None])[1,1]
    #array([[ 0.,  0.],
    #       [ 0.,  0.]])
    
        2
  •  2
  •   L_W    4 年前

    自从 a b 都是一样的形状,比如说 (2,2,2) a+b 确实有效。 广播的工作方式是,它以相反的顺序匹配操作数的维数,从最后一个维数开始向上(例如,在二维情况下考虑行之前的列)。如果尺寸匹配,则考虑下一个尺寸。

    如果尺寸不匹配,并且其中一个尺寸是 1 然后重复该操作数的维数以匹配另一个操作数(例如,如果 a.shape = (2,1,2) b.shape = (2,2,2) 然后,第1维的值 (2,2,2) )