在没有中间体的情况下生成点输出切片

Producing slices of dot output without intermediates

我有一大组 3 x 3 矩阵(比如 n 个矩阵)和对应的 3 x 1 向量,我想将每个向量乘以其对应的矩阵。如果我将矩阵堆叠成 n x 3 x 3 ndarray 称为 R 并将向量堆叠成 3 x n ndarray 称为 v , 我可以通过

获得乘法向量的堆栈
import numpy as np
intermediate = np.dot(R, v)
out = np.diagonal(intermediate, axis1=0, axis2=2)

但这非常低效:np.dot 生成 n x 3 x n intermediate 数组,然后我从中手动 select a 3 x n 片。除了循环 n 之外,我能否以某种方式生成 3 x n 数组而不生成中间 n x 3 x n 数组?

扩展@hpaulj 提供的提示:我描述的乘法可以通过以下方式执行,

out = np.einsum('ijk,ki->ji', R, v)

n = 1000:

我的问题中的方法的加速已经是 3 个数量级 (!)
%timeit d = np.diagonal(np.dot(R, v), axis1=0, axis2=2)
10 loops, best of 3: 27.8 ms per loop

%timeit o = np.einsum('ijk,ki->ji', R, v)
10000 loops, best of 3: 21.9 µs per loop