簡體   English   中英

使用for循環python對列表中的值求和時獲取NaN

[英]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 == nannan + 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM