我有一个3xN
数组,从概念上讲是一个N
3矢量数组,我想构建一个
数组是由矩阵乘以给定的3x3
矩阵与每列的
阵列。有没有一种很好的方法以矢量化的方式做到这一点?
目前,我的问题是3xN
,但我将来可能需要考虑3xNxM
(或更多)。
Loopy方法
U=numpy.rand( [3,24] )
R=numpy.eye(3) # placeholder
for i in xrange( U.shape[1]):
U[:,i]=numpy.dot( R, U[:,i] )
答案 0 :(得分:4)
使用np.einsum函数,即使对于多维问题也可以这样做:
U = np.random.rand(3,24,5)
R = np.eye(3,3)
result = np.einsum( "ijk,il", U,R )
符号有点棘手:你首先给出的字符串表示数组维度的不足;所以对于U,indeces ijk是每个维度的运行indeces。它遵循爱因斯坦求和约定,因此字符串中具有相同字母的indeces将被求和。有关详细信息,请阅读ScipyDocs。我确定在你的情况下点数更快,因为开销更少,它可能会使用一些blas例程,但正如你所说,你想要扩展到更多维度,这可能是你要走的路。 / p>
答案 1 :(得分:3)
在这种情况下,您只需致电np.dot(R, U)
,它就会起作用:
import numpy as np
np.random.seed(0)
U = np.random.rand(3,24)
R = np.random.rand(3,3)
result = np.empty_like(U)
for i in range( U.shape[1]):
result[:,i] = np.dot(R, U[:,i])
print result
print np.allclose(result, np.dot(R, U))
对于(3xNxM)
案例,您可以重塑为(3x(N.M)),dot
并重新整理结果,类似于我的回答here