例如,我得到了形状(3,2,2)的矩阵A,例如
[
[[1,1],[1,1]],
[[2,2],[2,2]],
[[3,3],[3,3]]
]
和形状(2,2)的基质B,例如
[[1, 1], [0,1]]
我想实现形状c(3,2,2),如:
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.]]]
实现这一目标的最有效方法是什么?
感谢。
答案 0 :(得分:2)
使用np.tensordot
然后交换轴。所以,使用其中一个 -
np.tensordot(B,A,axes=((1),(1))).swapaxes(0,1)
np.tensordot(A,B,axes=((1),(1))).swapaxes(1,2)
我们可以在交换轴后将A
重新整形为2D,使用np.dot
进行二维矩阵乘法,并重新塑造和交换轴,以获得边际性能提升。
计时 -
# 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
答案 1 :(得分:1)
另一种解决方案:
np.flip(np.dot(A,B).transpose((0,2,1)),1)