我知道有數百萬個類似的問題,但我無法解決我的問題。我有一個由 4 列組成的資料集(能量與 3 個極化中介電函式的虛部)。我想應用Kramers-Kronig 關系來找到每個能量點的實部,因此結果將與輸入資料具有相同的維度。對于 mwe,資料檔案如下所示:
1.92000 0.45314 0.45774 0.44148
1.92100 0.45387 0.45846 0.44223
1.92200 0.45460 0.45918 0.44297
1.92300 0.45533 0.45990 0.44372
1.92400 0.45605 0.46062 0.44446
1.92500 0.45677 0.46134 0.44520
到目前為止,我的代碼是:
import numpy as np
import math
data = np.loadtxt('opt.mgsin2gan', skiprows=1)
dw = data[1,0] - data[0,0]
## This is the expression being integrated.
def frac(x,pol):
arg = len(data)
mid = 0
for i in range(len(data)):
if data[i,0] == x:
pass
else:
mid = data[i,0]*data[i,pol]/(data[i,0]**2-x**2)
# return 1 (2/math.pi)*mid*dw
result = 1 (2/math.pi)*mid*dw
print(result)
## Evaluates the expression for every energy point
def grid(a):
for i in data[:,0]:
frac(i,a)
# return frac(i,a)
## Evaluates the expression for each polarization
def polarization():
for i in [1,2,3]:
grid(i)
# return grid(i)
if __name__ == "__main__":
polarization()
它在螢屏上列印結果,但我無法將資料保存在文本檔案中,因為它不回傳任何內容。但是,當我取消注釋每個函式中的回傳行時,我得到了錯誤的結果。如何將結果保存在 numpy 陣列中?另外,我怎樣才能使這段代碼更優雅?使其更簡單可能會使它在更短的時間內運行。
uj5u.com熱心網友回復:
我猜你正在尋找這樣的東西:
def frac(x,pol):
arg = len(data)
mid = 0
for i in range(len(data)):
if data[i,0] == x:
pass
else:
mid = data[i,0]*data[i,pol]/(data[i,0]**2-x**2)
# return 1 (2/math.pi)*mid*dw
result = 1 (2/math.pi)*mid*dw
print(result)
return result
## Evaluates the expression for every energy point
def grid(a):
# return list here
return [frac(i, a) for i in data[:,0]]
## Evaluates the expression for each polarization
def polarization():
# yield values for each i
for i in [1,2,3]:
yield from grid(i)
result = list(polarization())
我已經更改了grid函式以回傳一個串列,并更改了函式polarization以產生每個i.
if data[i,0] == x順便說一句,在處理浮點數時,行可能很危險。相反,您可能想檢查兩個數字在數字上是否接近,例如使用np.isclose.
在這種情況下,您可能可以加快重寫numpy代碼或使用的速度。numba
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/417295.html
標籤:
上一篇:在型別提示中使用冒號':'
