生成没有中间体的点输出切片

时间:2015-01-07 22:56:11

标签: python arrays numpy

我有一大组3 x 3矩阵(比如说n)和相应的3 x 1向量,并希望将每个向量乘以其相应的矩阵。如果我将矩阵堆叠到名为n的{​​{1}} 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 x 3 x n n数组,然后我会手动选择3 x {{1}切片。除了循环intermediate之外,我可以以某种方式生成3 x n数组,而不会生成中间n x 3 x n数组吗?

1 个答案:

答案 0 :(得分:5)

扩展@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