用numpy计算三维矩阵乘法的有效方法

用numpy计算三维矩阵乘法的有效方法,numpy,matrix,optimization,matrix-multiplication,numpy-ndarray,Numpy,Matrix,Optimization,Matrix Multiplication,Numpy Ndarray,如何使用numpy高效地编写和计算此乘法: for k in range(K): for i in range(SIZE): for j in range(SIZE): for i_b in range(B_SIZE): for j_b in range(B_SIZE): for k_b in range(k+1): data[k, i * w + i_b,

如何使用numpy高效地编写和计算此乘法:

 for k in range(K):
    for i in range(SIZE):
       for j in range(SIZE):
          for i_b in range(B_SIZE):
             for j_b in range(B_SIZE):
                for k_b in range(k+1):
                   data[k, i * w + i_b, j * h + j_b] += arr1[k_b, i_b, j_b] * arr2[k_b, i, j]
例如:

SIZE, B_SIZE = 32, 8
arr1.shape -> (8, 8, 8)
arr2.shape -> (8, 32, 32)
data.shape -> (K, 256, 256)

谢谢。

您可以使用Numba处理此类非琐碎的情况,并返工循环以有效使用CPU缓存。以下是一个例子:

将numba作为nb导入
@nb.njit
def计算(数据、arr1、arr2):
对于范围(k)内的k:
对于范围(k+1)内的k_b:
对于范围内的i(尺寸):
对于范围内的j(尺寸):
tmp=arr2[k_b,i,j]
对于范围内的i_b(b_尺寸):
对于范围内的j_b(b_尺寸):
数据[k,i*w+i_b,j*h+j_b]+=arr1[k_b,i_b,j_b]*tmp

如果只执行一次此操作,则可以通过提供数组类型预编译Numba代码。如果
K
很大,那么您可以使用
@nb.njit(parallel=True)
将代码并行化,并对nb.prange(K)中的K使用
,而不是对范围(K)
中的K使用
。这应该是几个数量级的因素。

k
8
之间的关系是什么?乍一看,似乎
einsum
matmul
可以做到这一点;至少有
+=
*
。但是6个迭代器之间的映射是复杂的(并且需要太多的工作:())。