gpt4 book ai didi

python - Numpy 将 3d 矩阵乘以 2d 矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 10:50:49 24 4
gpt4 key购买 nike

例如,我得到形状为 (3,2,2) 的矩阵 A,例如

[
[[1,1],[1,1]],
[[2,2],[2,2]],
[[3,3],[3,3]]
]

和形状为 (2,2) 的矩阵 B,例如

[[1, 1], [0,1]]

我想实现形状为 (3,2,2) 的 c,例如:

c = np.zeros((3,2,2))
for i in range(len(A)):
c[i] = np.dot(B, A[i,:,:])

给出

[[[2. 2.]
[1. 1.]]

[[4. 4.]
[2. 2.]]

[[6. 6.]
[3. 3.]]]

实现此目标的最有效方法是什么?

谢谢。

最佳答案

使用np.tensordot然后交换轴。所以,使用其中之一 -

np.tensordot(B,A,axes=((1),(1))).swapaxes(0,1)
np.tensordot(A,B,axes=((1),(1))).swapaxes(1,2)

我们可以在交换轴后将 A reshape 为 2D,将 2D 矩阵乘法与 np.dot reshape 和交换轴以获得边际性能提升。

时间 -

# Original approach
def orgapp(A,B):
m = A.shape[0]
n = B.shape[0]
r = A.shape[2]
c = np.zeros((m,n,r))
for i in range(len(A)):
c[i] = np.dot(B, A[i,:,:])
return c

In [91]: n = 10000
...: A = np.random.rand(n,2,2)
...: B = np.random.rand(2,2)

In [92]: %timeit orgapp(A,B)
100 loops, best of 3: 12.2 ms per loop

In [93]: %timeit np.tensordot(B,A,axes=((1),(1))).swapaxes(0,1)
1000 loops, best of 3: 191 µs per loop

In [94]: %timeit np.tensordot(A,B,axes=((1),(1))).swapaxes(1,2)
1000 loops, best of 3: 208 µs per loop

# @Bitwise's solution
In [95]: %timeit np.flip(np.dot(A,B).transpose((0,2,1)),1)
1000 loops, best of 3: 697 µs per loop

关于python - Numpy 将 3d 矩阵乘以 2d 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50796440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com