我有两个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)
答案 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)