Python 将点积应用于三维阵列中的所有列
我有一个3D阵列,我需要在一个方向上变换。我有一个矩阵Python 将点积应用于三维阵列中的所有列,python,numpy,linear-algebra,Python,Numpy,Linear Algebra,我有一个3D阵列,我需要在一个方向上变换。我有一个矩阵map_y,它包含一个方向上的变换,我使用np.dot应用该变换。是否可以避免下面代码中嵌套的for循环 import numpy as np nx, ny, nz = 64, 32, 24 nyc = 11 a = np.random.rand(nz, ny, nx) ac = np.empty((nz, nyc, nx)) map_y = np.random.rand(nyc, ny) # Can we do this in a
map_y
,它包含一个方向上的变换,我使用np.dot
应用该变换。是否可以避免下面代码中嵌套的for
循环
import numpy as np
nx, ny, nz = 64, 32, 24
nyc = 11
a = np.random.rand(nz, ny, nx)
ac = np.empty((nz, nyc, nx))
map_y = np.random.rand(nyc, ny)
# Can we do this in a single numpy function?
for k in range(nz):
for i in range(nx):
ac[k,:,i] = np.dot(map_y, a[k,:,i])
使用-
关于问题的einsum
说明:
轴可以被认为是示意图,就像这样-
a : i x j x k
map_y : l x j
output : i x l x k
因此,j
是对齐的,并且输出的和也减少了,而其余的是“叉出来的”,为我们提供了所需的输出
有关更多信息,请参阅链接文档
另外,在
np.einsum
中将optimize
标记设置为True
以使用BLAS,可以使用optimize
来使用它。您能更详细地解释一下einsum
的第一个参数吗?如果将nz,ny,nx,nyc
映射到i,j,k,l
,则中的字符串几乎会自动写入。它们是a
和map_y
(和ac
)各自维度的索引。Chiel补充了一些解释。发布的解决方案对你有用吗?效果很好。我不知道einsum
的功能。
a : i x j x k
map_y : l x j
output : i x l x k