我有一个3d numpy数组u,形状(k,m,n),我正在尝试计算一个新的数组uprod,形状(k,m,n),这样uprod [j] = np.dot (A,u [j]),其中A是一个完全不依赖于j的固定矩阵。我可以轻松地在最内层索引上编写一个循环,但是有更快/更好的方法吗?
答案 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)
的结果数组;您可以使用rollaxis
或transpose
与result[i, j, k] == A[j, :].dot(u[i, :, k])
参数进行此操作。
axes
result = numpy.rollaxis(A.dot(u), 1)
使广播变得容易,einsum
用于高维输入有点像外部产品。使用与之前相同的dot
和X
,如果您设置了
Y
然后result = numpy.rollaxis(X.dot(Y), axis=X.ndim-2, start=X.ndim+Y.ndim-3)
将是一个形状result[1, 2, 3]
等于(5, 5)
的数组。