2016-06-30 152 views
2

的另一个二进制ndarray每个元素我有两个ndarrays:乘法NumPy的ndarray与不同尺寸

a = [[30,40], 
    [60,90]] 

b = [[0,0,1], 
    [1,0,1], 
    [1,1,1]] 

请注意到一个形状可能更大但总是正方形阵列(50,50),(100,100) 该通缉的结果是:

Result = [[a*0,a*0,a*1], 
     [[a*1,a*0,a*1], 
     [[a*1,a*1,a*1]] 

我设法与此代码正确的答案,但我认为会有一个建在numpy的功能,在快速的方式完成这一任务

totalrows=[] 
    for row in range(b.shape[0]): 
     cells=[] 

     for column in range(b.shape[1]): 
      print row,column 
      cells.append(b[row,column]*a) 
     totalrows.append(np.concatenate(cells,axis=1)) 
    return np.concatenate(totalrows,axis=0) 

回答

2

对于这种基于块的元素乘法问题,确实存在一个NumPy内置的np.kron。为了解决你的情况下,它可以用来像这样 -

np.kron(b,a) 

采样运行 -

In [50]: a 
Out[50]: 
array([[30, 40], 
     [60, 90]]) 

In [51]: b 
Out[51]: 
array([[0, 0, 1], 
     [1, 0, 1], 
     [1, 1, 1]]) 

In [52]: np.kron(b,a) 
Out[52]: 
array([[ 0, 0, 0, 0, 30, 40], 
     [ 0, 0, 0, 0, 60, 90], 
     [30, 40, 0, 0, 30, 40], 
     [60, 90, 0, 0, 60, 90], 
     [30, 40, 30, 40, 30, 40], 
     [60, 90, 60, 90, 60, 90]]) 

3D阵列情况下

现在,让我们说,我们正在与a工作作为3D阵列(m,n,p)b作为(q,r)并假设你是希望沿着a的最后一个轴迭代地执行这样的逐块乘法。因此,形状将沿着两个输入的前两个轴相乘以得到输出阵列。为了达到这样的输出,我们需要通过引入一个单独的维度作为最后一个轴来扩展b的维度。最终产出将形状为(m*q,n*r,p*1)。实施将是简单的 -

np.kron(b[...,None],a) 

形状检查 -

In [161]: a = np.random.randint(0,99,(4,5,2)) 
    ...: b = np.random.randint(0,99,(6,7)) 
    ...: 

In [162]: np.kron(b[...,None],a).shape 
Out[162]: (24, 35, 2) 
+0

我执行的功能,用我的。 b.shape =(4,3),a.shape =(100,100,3) kron给我这个形状: (100,400,9) 但是所需的输出形状: (400,300,3) – samer226047

+0

@ samer226047只需将一个轴添加到'b'并使用'kron':'np.kron(b [...,None],a)'。希望这能为你解决! – Divakar

+0

它确实工作,非常感谢你:) – samer226047