在没有中间体的情况下生成点输出切片
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
我有一大组 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
:
%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