我正在尝试在 numpy 中将两个维数相当大的矩阵相乘。请参阅下面的 3 种方法。我随机实现了这 3 个矩阵来展示我的问题。第一个矩阵,即Y1[:,:,0]
首先是一个更大的 3d 数组的一部分。第二个是.copy()
这个矩阵的,第三个是它自己的矩阵。
为什么第一次乘法比后两次乘法慢这么多?
import numpy as np
from time import time
Y1 = np.random.uniform(-1, 1, (5000, 1093, 201))
Y2 = Y1[:,:,0].copy()
Y3 = np.random.uniform(-1, 1, (5000, 1093))
W = np.random.uniform(-1, 1, (1093, 30))
# method 1
START = time()
Y1[:,:,0].dot(W)
END = time()
print(f"Method 1 : {END - START}")
# method 2
START = time()
Y2.dot(W)
END = time()
print(f"Method 2 : {END - START}")
# method 3
START = time()
Y3.dot(W)
END = time()
print(f"Method 3 : {END - START}")
输出时间分别大约为34、0.06、0.06秒。
我看到了区别:虽然最后两个矩阵是“真正的”二维数组,但第一个矩阵是我更大的三维数组的一部分。
子集化Y1[:,:,0]
导致速度如此缓慢吗?另外,我注意到为矩阵 Y2 创建 Y1 的副本也相当慢。
毕竟,我得到了这个 3d 数组,并且必须重复计算 Y1 切片与(可能不同的)矩阵 W 的矩阵乘积。有没有更好/更快的方法来做到这一点?
提前致谢!