Python 不含中间产物的点输出切片的生产

Python 不含中间产物的点输出切片的生产,python,arrays,numpy,Python,Arrays,Numpy,我有一个很大的3 x 3矩阵集(n),和相应的3 x 1向量,我想用每个向量乘以相应的矩阵。如果我将矩阵堆叠成一个称为R的nx3x3ndarray并将向量堆叠成一个称为v的3xndarray,我可以通过 import numpy as np intermediate = np.dot(R, v) out = np.diagonal(intermediate, axis1=0, axis2=2) 但是这是非常低效的:np.dot产生nx3xn中间数组,然后我从中手动选择一个3xn切片。除了在n上

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

import numpy as np
intermediate = np.dot(R, v)
out = np.diagonal(intermediate, axis1=0, axis2=2)

但是这是非常低效的:
np.dot
产生
n
x3x
n
中间
数组,然后我从中手动选择一个3x
n
切片。除了在
n
上循环之外,我是否可以在不生成中间
n
x3x
n
数组的情况下,以某种方式生成3x
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

看看
np.einsum
@MattDMo,这并不能避免生成中间数组。它只是避免给它指定一个名称。但是它仍然需要占用内存,并且需要构造计算。我仍然是一个新手——就像我说的,胡乱猜测:)在不久的将来的某个时候,使用Python 3.5和即将推出的numpy版本,你可以做到:
out=R@v.T[:,None,:]
,请参见。