【发布时间】:2021-12-12 22:32:12
【问题描述】:
假设我有一个大小为 (M,N,D,D) 的数组 A 和一个大小为 (M,N,D) 的向量 x。我想生成大小为 (M,N,D) 的数组 b 其中 b[m,n,:] = np.matmul(A[m,n,:,:],x[m,n,:]) .所以基本上,包含在 A[m,n,:] 中的 D-by-D 矩阵和包含在 x[m,n,:] 中的大小为 D 的向量应该在标准矩阵向量乘法之后相乘。一个天真的 for 循环实现是
for m in range(M):
for n in range(N):
b[m,n,:] = np.matmul(A[m,n,:],x[m,n,:])
显然这对于大的 N 和 M 来说是低效的(对我来说就是这种情况;N 大约为 100,000,M 大约为 1000)。我的问题是:如何向量化这个循环?我尝试过使用 np.tensordot 但无论我如何尝试构造它,我都会遇到形状不匹配的问题,大概是因为 A 有 4 个轴,而 x 有 3 个(请注意,据我所知, np.tensordot is使用正确的功能,我只是没有正确使用它)
【问题讨论】:
-
np.matmul(A[m,n,:,:],x[m,n,:])对两个数组的最后一个维度进行乘积求和,其中x[m,n,:]是1d,并由(根据文档)作为x[m,n,:,None](第二至最后)。matmul的关键概念是“A 的最后一个,B 的第二个到最后一个”。主要维度,这里m,n是“批量”维度。 (tensordot不处理“批次”)。
标签: arrays numpy multidimensional-array scipy vectorization