[英]Getting NaN when summing values in list with a for loop python
但是我在第二個學期遇到了問題。
到目前為止,這是我的代碼:
hbar = 1.05457e-34
kB_si = 1.380649e-23
T = 3500
path = 'C:\\Users\\valit\\' #path to file
file = 'data_175_phonopy_.dat'
k,f = np.loadtxt(path +file, unpack=True)
f = f//1e-12 #to convert THz to Hz
# print(f)
nondeg = []
for i in f:
if i not in nondeg:
nondeg.append(i)
svib = 0
for i in range(len(nondeg)):
svib = svib + (-kB_si * (math.exp((-hbar * nondeg[i])/(kB_si * T))) - (1/T) * hbar * nondeg[i] / (math.exp((hbar * nondeg[i])/(kB_si * T)) - 1)) #nan
print(svib)
當我打印 svib 時,我得到 Nan 並顯示以下消息:
nan
C:\Users\valit\svib_modes.py:45: RuntimeWarning: invalid value encountered in double_scalars
svib = svib - ((1/T) * hbar * nondeg[i] / (math.exp((hbar * nondeg[i])/(kB_si * T)) - 1))
我知道問題出在第二個詞上,因為我分別添加了兩個詞,而第一個給了我一個非常小的數字。 您對如何擺脫 NaN 有什么建議嗎? 如果我的問題真的很簡單,我深表歉意,但我已經卡了一段時間,找不到解決方法。
提前謝謝大家。
您的文件中可能存在不是數字的值,並且對nan
執行算術運算會導致nan
。 即nan * 3 == nan
和nan + 3 == nan
。
如果您只想忽略文件中的nan
值,而只對數字進行操作,則可以將它們過濾掉:
f = f[~numpy.isnan(f)]
只需確保您確實想忽略nan
值,並且由於某些您無法安全忽略的問題,它們不存在。
此錯誤有多種原因,如“double_scalars 中遇到的無效值”警告中所述,可能是 numpy 。 因此,如果沒有數據,很難為您提供幫助。
但是,我建議您調查是否發生被零除,因為這似乎是導致此錯誤的常見原因。
此外,您正在一次計算一個很長的表達式。 我應該說這是一個非常糟糕的做法。
相反,將您的表達式拆分為更小的部分並逐步計算它,在每一步之前進行所需的驗證。
例如,而不是:
x = a / b + c * d / e
做類似的事情會更合理:
if (b == 0):
# raise error, or do something about it
x = a / b
if (e == 0):
# raise error, or do something about it
x += c * d / e
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.