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对此进行了解释!