numpy:广播矩阵乘以数组

时间:2014-04-09 17:33:19

标签: python arrays numpy matrix

我有一个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] )

2 个答案:

答案 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

相关问题