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

Ted*_*lik 3 python arrays numpy

我有一大组3 x 3矩阵(n比如说)和相应的3 x 1向量,并希望将每个向量乘以其相应的矩阵.如果我将矩阵堆叠成一个被调用的nx 3 x 3 并将向量转换成一个被调用的3 x ,我可以获得叠加的乘法向量,ndarrayRn ndarrayv

import numpy as np
intermediate = np.dot(R, v)
out = np.diagonal(intermediate, axis1=0, axis2=2)
Run Code Online (Sandbox Code Playgroud)

但效率非常低:np.dot生成nx 3 x n intermediate数组,然后我手动选择3 x n切片.除了通过循环n,我可以以某种方式产生3 x n数组而不制作中间nx 3 x n数组?

Ted*_*lik 5

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

out = np.einsum('ijk,ki->ji', R, v)
Run Code Online (Sandbox Code Playgroud)

在我的问题中,接近加速的速度已经达到3个数量级(!)n = 1000:

%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
Run Code Online (Sandbox Code Playgroud)

  • 在不久的将来的某个时候,使用Python 3.5和即将推出的numpy版本,你可以这样做:`out = R @ vT [:,None,:]`,见[here](https://www.python.org的/ dev/PEPS/PEP-0465 /). (2认同)