我正在尝试对一个函数进行矢量化,该函数将3分量矢量“x”和3x3“矩阵”作为输入并生成标量
def myfunc(x, matrix):
return np.dot(x, np.dot(matrix, x))
然而,这需要被称为“n”次,并且向量x每次都具有不同的分量。我想修改这个函数,使得它输入一些3xn数组(其中的列是向量x)并生成一个向量,其组件是在每次迭代时计算的标量。
我可以写下完成这项工作的爱因斯坦求和,但它需要我构建原始3x3的3x3xn堆栈“副本”。我担心这样做会扼杀我试图做到的任何性能提升。有没有办法计算我想要的矢量而不复制3x3?
答案 0 :(得分:3)
让x
为3xN数组,y
为3x3数组。你正在寻找
z = numpy.einsum('ji,jk,ki->i', x, y, x)
你也可以构建你正在讨论的3x3xN阵列作为y
的视图以避免复制,但这不是必需的。