我有一个 8x8x25000 的阵列 W 和一个 8 x 25000 的阵列 r。我想将 W 的每个 8x8 切片乘以 r 的每一列 (8x1) 并将结果保存在 Wres 中,最终将成为一个 8x25000 矩阵。

我正在使用 for 循环来完成此操作:

for i in range(0,25000):
    Wres[:,i] = np.matmul(W[:,:,i],res[:,i])

但这很慢,我希望有一种更快的方法来实现这一点。

有任何想法吗?

最佳答案

只要 2 个数组共享相同的 1 轴长度,Matmul 就可以传播。从文档:



因此,您必须在 matmul 之前执行 2 个操作:

import numpy as np
a = np.random.rand(8,8,100)
b = np.random.rand(8, 100)
  • 转置 ab 以便第一个轴是 100 个切片
  • b 添加一个额外的维度,以便 b.shape = (100, 8, 1)

  • 然后:
     at = a.transpose(2, 0, 1) # swap to shape 100, 8, 8
     bt = b.T[..., None] # swap to shape 100, 8, 1
     c = np.matmul(at, bt)
    
    c 现在是 100, 8, 1 ,重塑回 8, 100 :
     c = np.squeeze(c).swapaxes(0, 1)
    

    或者
     c = np.squeeze(c).T
    

    最后,一个单行只是为了方便:
    c = np.squeeze(np.matmul(a.transpose(2, 0, 1), b.T[..., None])).T
    

    关于python - 将 2-d 矩阵的每一列乘以 3-d 矩阵的每个切片的更有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44980238/

    10-12 20:26