将矩阵A乘以多维矩阵“矩阵式?”

时间:2015-06-05 19:44:56

标签: python numpy

我有一个3d numpy数组u,形状(k,m,n),我正在尝试计算一个新的数组uprod,形状(k,m,n),这样uprod [j] = np.dot (A,u [j]),其中A是一个完全不依赖于j的固定矩阵。我可以轻松地在最内层索引上编写一个循环,但是有更快/更好的方法吗?

1 个答案:

答案 0 :(得分:3)

np.einsum可以完成这项工作:

//: Playground - noun: a place where people can play

import Cocoa

let cursor = NSCursor.arrowCursor().image.TIFFRepresentation

let searchPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)

let documentsPath = searchPaths[0] as! String
let savePath = documentsPath.stringByAppendingPathComponent("cursor.tiff")

cursor?.writeToFile(savePath, atomically: true)

您也可以进行广播,因此如果将result = numpy.einsum('ij,kjl->kil', A, u) X视为2D矩阵数组,则以下调用将执行适当的广播Y

dot

例如,如果result = numpy.einsum('...ij,...jk->...ik', X, Y) 的形状为X(3, 4, 5, 6)的形状为Y,则(4, 6, 5)将为形状result[1, 2]的数组等于(5, 5)

您也可以使用dot执行此操作。 X[1, 2].dot(Y[2])生成一个A.dot(u)的结果数组。你想要一个A.dot(u)[i, j, k] == A[i, :].dot(u[j, :, k)的结果数组;您可以使用rollaxistransposeresult[i, j, k] == A[j, :].dot(u[i, :, k])参数进行此操作。

axes

result = numpy.rollaxis(A.dot(u), 1) 使广播变得容易,einsum用于高维输入有点像外部产品。使用与之前相同的dotX,如果您设置了

Y

然后result = numpy.rollaxis(X.dot(Y), axis=X.ndim-2, start=X.ndim+Y.ndim-3) 将是一个形状result[1, 2, 3]等于(5, 5)的数组。