我在 python 中有復雜的回圈,我試圖“矢量化”以改善計算時間。我找到了np.einsum允許它的功能,我設法使用它,但我陷入了另一個回圈。
在下面的代碼中,我把我設法“einsumize”(s1)的回圈放在了另一個我沒有放在的地方。
import numpy as np
Q = 6
P = 24
N = 40
bQ = np.arange(Q)
bP = np.arange(P)
uN = np.arange(N)
t1 = np.arange(P*Q*N).reshape([Q,P,N])
t2 = np.arange(Q*N*Q*N).reshape([Q,N,Q,N])
s1_ = np.einsum('p,q,n,qpn',bP, bQ, uN, t1)
s1 = 0
for p in range(P):
for q in range(Q):
for n in range(N):
s1 = bP[p] * bQ[q] * uN[n] * t1[q,p,n]
print(s1)
print(s1_)
print()
s2_ = np.einsum('p,q,n,m,pnqm', bQ, bQ, uN, uN, t2)
s2 = 0
for p in range(Q):
for q in range(Q):
for n in range(N):
for m in range(N):
s2 = bQ[q] * bQ[q] * uN[n] * uN[m] * t2[p,n,q,m]
print(s2)
print(s2_)
前面代碼的結果是
13475451600
13475451600
6125547636000
5707354770000
要計算的數學公式s1是:s1 = \sum_p\sum_q\sum_n bP[p] * bQ[q] * uN[n] * t1[q,p,n]。而要計算s2的是s2 = \sum_q\sum_q'\sum_n\sum_n' bQ[q] bQ[q'] uN[n] uN[n'] t2[q,n,q',n']。
對于三重回圈,如果我很好地理解了如何einsum作業,我會告訴將被相乘的張量的不同索引,并且告訴沒有輸出索引會告訴所有將被求和。但它似乎不適用于四重回圈。
編輯:我看到一個答案(似乎已被洗掉),告訴它只是四重回圈上的索引錯誤......我應該看到它:/
uj5u.com熱心網友回復:
我在您的代碼中看到一個錯字,您沒有使用p4 階張量之外的變數。
嘗試改變
s2 = bQ[q] * bQ[q] * uN[n] * uN[m] * t2[p,n,q,m]
為了
s2 = bQ[p] * bQ[q] * uN[n] * uN[m] * t2[p,n,q,m]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/439822.html
上一篇:numpy“TypeError:輸入型別不支持ufunc'bitwise_and'”并且輸入無法安全地強制轉換為任何支持的型別
