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

Python 将NumPy ndarray与另一个大小不同的二进制ndarray中的每个元素相乘,python,numpy,Python,Numpy,我有两个时间表: a = [[30,40], [60,90]] b = [[0,0,1], [1,0,1], [1,1,1]] 请注意,形状可能更大,但始终是方形阵列(50,50),(100100) 结果是: Result = [[a*0,a*0,a*1], [[a*1,a*0,a*1], [[a*1,a*1,a*1]] 我用这段代码设法得到了正确的答案,但我认为numpy中有一个内置函数可以快速完成这项任务 totalr

我有两个时间表:

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

b = [[0,0,1],
    [1,0,1],
    [1,1,1]]
请注意,形状可能更大,但始终是方形阵列(50,50),(100100) 结果是:

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)

事实上,对于这种基于块的元素乘法问题,有一个NumPy内置程序。为了解决你的问题,可以这样使用它-

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)

我用我的执行了这个函数。对于b.shape=(4,3),a.shape=(100100,3)kron给我这个形状:(100400,9)但是所需的输出形状:(400300,3)@samer226047,只需在
b
中添加一个轴,并使用
kron
np.kron(b[…,None],a)
。希望这对你有用@samer226047对此进行了解释!