我有一个三维的numpy数组u,shape (k,m,n),并且我试图计算一个新的数组连根-- shape (k,m,n),使得fixed = np.dot(A,uj),其中A是一个完全不依赖j的固定矩阵。我可以轻松地在最内部的索引上编写一个循环,但是有更快/更好的方法吗?
发布于 2015-06-05 20:10:02
np.einsum可以完成以下工作:
result = numpy.einsum('ij,kjl->kil', A, u)您也可以让它广播,所以如果X和Y被认为是2D矩阵的数组,下面的调用将执行适当的广播dot
result = numpy.einsum('...ij,...jk->...ik', X, Y)例如,如果X具有(3, 4, 5, 6)形状,而Y具有形状(4, 6, 5),那么result[1, 2]将是一个形状(5, 5)数组,等于X[1, 2].dot(Y[2])。
您也可以使用dot来完成这一任务。A.dot(u)使用A.dot(u)[i, j, k] == A[i, :].dot(u[j, :, k)生成一个结果数组。您需要一个带有result[i, j, k] == A[j, :].dot(u[i, :, k])的结果数组;您可以使用rollaxis或带有axes参数的transpose实现这一点。
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)的数组,该数组的形状与X[1, 2].dot(Y[3])相等。
https://stackoverflow.com/questions/30674587
复制相似问题