将NumPy ndarray与另一个不同大小的二进制ndarray中的每个元素相乘

时间:2016-06-30 11:21:57

标签: python 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)

1 个答案:

答案 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)