在 python 中创建对称矩阵的最快方法,元素如下
Fastest way to create a symmetric matrix in python, with elements as below
我有一组数组
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
)。
我将这组 K
存储在一个名为 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。我只是想加快速度。
您正在使用对称矩阵的属性,使其非常高效。一种加快速度的方法是使用 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
我有一组数组
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
)。
我将这组 K
存储在一个名为 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。我只是想加快速度。
您正在使用对称矩阵的属性,使其非常高效。一种加快速度的方法是使用 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