Python 不含中间产物的点输出切片的生产
我有一个很大的3 x 3矩阵集(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上
n
),和相应的3 x 1向量,我想用每个向量乘以相应的矩阵。如果我将矩阵堆叠成一个称为R
的n
x3x3ndarray
并将向量堆叠成一个称为v
的3xndarray
,我可以通过
import numpy as np
intermediate = np.dot(R, v)
out = np.diagonal(intermediate, axis1=0, axis2=2)
但是这是非常低效的:
np.dot
产生n
x3xn
中间数组,然后我从中手动选择一个3xn
切片。除了在n
上循环之外,我是否可以在不生成中间n
x3xn
数组的情况下,以某种方式生成3xn
数组?扩展@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,:]
,请参见。