我知道有数以百万计的类似问题,但我无法解决我的案子。我有一个由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数组中?此外,我如何使这段代码更优雅呢?简化它可能会使它在更短的时间内运行。
发布于 2022-01-20 23:44:47
我猜你是在找这样的东西:
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://stackoverflow.com/questions/70794138
复制相似问题