我想将张量
R = {R_1, R_2, ..., R_M}
和 X = {X_1, X_2, ..., X_M}
相乘,其中 R_i
和 X_i
分别是 3×3
和 3×N_i
矩阵。如何在形成 R_i × X_i
数组的过程中最大限度地利用 NumPy 功能?
我的MWE如下:
import numpy as np
np.random.seed(0)
M = 5
R = [np.random.rand(3, 3) for _ in range(M)]
X = []
for i in range(M):
N_i = np.random.randint(1, 6)
X_i = np.random.rand(3, N_i)
X.append(X_i)
result = np.zeros((3, 0))
for i in range(M):
R_i = R[i]
X_i = X[i]
result = np.hstack((result, np.dot(R_i, X_i)))
print(result)
我认为没有更多的事情要做。 根据
N_i
的分布方式(例如,如果 N_i 的一半是 5,另一半是 10),拥有两个 X 可能会有所帮助(一个 M×5 X 代表 5 个第一列,一个(M/ 2)×5 X 为其他)。
或者,在其他一些情况下,用 0 填充 X(例如,如果 i 的 99% 为 N_i 为 10000,其余 % 为 9999)。
但是,粗略地说,numpy 是处理齐次维度数组的。
有一点:永远不要在
hstack
循环中使用 stack
vstack
append
、for
或类似的东西。那是非常慢的。这意味着重新分配一个新数组并将前一个数组的所有内容复制到新数组中。
要么使用简单的Python列表来累积结果。并且只在最后进行堆叠
res=[]
for i in range(M):
R_i = R[i]
X_i = X[i]
res.append(np.dot(R_i, X_i))
np.hstack(res)
或者提前分配结果 numpy 数组,并在迭代时存储结果。
result=np.empty((3,sum(x.shape[1] for x in X)))
k=0
for i in range(M):
R_i = R[i]
X_i = X[i]
result[:,k:k+X_i.shape[1]]=np.dot(R_i,X_i)
k+=X_i.shape[1]