首页 > 解决方案 > 当我遍历列表中的每个元素时,我得到一个包含“nan”元素的列表,为什么?

问题描述

我试图通过使用 for 循环遍历列表中的每个元素来将列表中的每个元素相乘。这是我的代码:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt('spec.txt') #Reading in the text file
frequency_data = data[:,0] 

h = 6.626e-27 #Planck constant in erg s
c = 2.998e10 #speed of light (in vacuum) in cm/s
k = 1.381e-16 



def Bv(v,T):                
    k1 = (2.0*h)/(c**2)
    x2 = (h*v)/(k*T)
    return k1*((v**3)/(np.exp(x2) -1)) 

我试图遍历列表
Bv(frequency_data, 2.275)中的每个元素。

BB_v = []

for k in range(len(frequency_data)):
    c = Bv(frequency_data, 2.275)[k]*10**17
    BB_v.append(c)

print(BB_v)

输出:

[0.0, inf, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 
 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 
 nan, nan, nan, nan, nan, nan, nan]

/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:7: RuntimeWarning: divide 
by zero encountered in true_divide
import sys/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:6:RuntimeWarning: 
divide by zero encountered in double_scalars

但我得到了一个包含“nan”元素的列表。为什么我会得到一个包含“nan”元素的列表?

链接到数据

标签: pythonarrayspython-3.xfor-loop

解决方案


这与迭代无关,因为我们可以只用一个值重现问题。

由于机器精度,x2 的值非常接近于零,导致分母 np.exp(x2)-1 在数值上等于零:

def Bv(v,T):                
    k1 = (2.0*h)/(c**2)
    x2 = (h*v)/(k*T)
    print("x2={}".format(x2))
    return k1*((v**3)/(np.exp(x2) -1)) 


print(Bv(1., 2.275))

给出结果:

x2=4.160753532182104e-28
nan

/snap/jupyter/6/lib/python3.7/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in double_scalars

为避免这种情况,您应该重写 Bv 中分数的公式,使其在数值上与 x2 的小值兼容。例如,您可以在零附近进行泰勒展开:

当 x 趋于零时,np.exp(x) 趋于 1+x

所以 np.exp(x)-1 应该倾向于 x


推荐阅读