我有K0,K1,K2....Kn一維陣列定義的陣列集合
z
我希望在不使用 for 回圈的情況下以最快的方式獲得以下對稱矩陣。
[np.trapz(K0*K0,z) np.trapz(K0*K1,z) np.trapz(K0*K2,z) np.trapz(K0*K3,z)...]
[ . np.trapz(K1*K1,z) np.trapz(K1*K2,z) np.trapz(K1*K3,z)...]
A = [ . . np.trapz(K2*K2,z) np.trapz(K2*K3,z)...]
[ . . . np.trapz(K3*K3,z)...]
[ . . . . ]
下面是我可以管理的最快的(對于大 n... 仍然不夠快n>10000)。
我將這些Ks集合存盤在一個名為的組合陣列中KK
KK = []
for i in range(n):
KK.append(Ki)
KK = np.array(KK)
A = np.zeros((n,n))
for i in range(n):
A[i,i:] = A[i:,i] = np.trapz((KK[i]*KK[i:]),z)
什么是更快的方法?我不在乎解決方案是多么不優雅或非 Pythonic。我只是想加快速度。
uj5u.com熱心網友回復:
您正在使用對稱矩陣的屬性使其非常有效。加快速度的一種方法是使用Numba
import numpy as np
import numba as nb
@nb.njit(cache=True, nogil=True, parallel=True)
def fun(KK,z,n):
A = np.zeros((n,n))
for i in nb.prange(n):
A[i,i:] = A[i:,i] = np.trapz((KK[i]*KK[i:]),z)
return A
舊答案
np.trapz(KK.T[:,:,None]@KK.T[:,None,:],z,axis=0) # using matrix multiplication
np.trapz(np.einsum('ik,jk->ijk',KK,KK),z,axis=2) # Using einsum
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316995.html
標籤:Python 麻木的 矩阵 jupyter-笔记本
上一篇:在python3中使用多處理時如何使用funcAnimation
下一篇:如何在特定區間下繪制符號函式
