避免Nan计算

时间:2017-02-08 00:19:46

标签: numpy nan

有人可以帮我吗?我试图在我的结果列表中避免使用nan值。因为如果p太接近于零,它会在我的新列表中生成nans。

import random
import numpy as np
from numpy import log 


def Compute(ListA):
    NewListA = []
    p = random.random()
    for item in ListA:
        u=np.exp(-(float(item)/500)**1.2)
        y=500*((np.log(1/(u*(1-p))))**(1/1.2))
        while y == nan:
            continue
        else:
            y=500*((np.log(1/(u*(1-p))))**(1/1.2))
            NewListA.append(y)
    return NewListA

ListA = [2.00345, 0.004, 3.0876, 6.00034, 8.0777, 9.444, 0.0004, 11.000678]
print (Compute(ListA))

4 个答案:

答案 0 :(得分:1)

使用if代替while;和isnan代替==nan

    if np.isnan(y):   #while y == nan:
        continue
    NewListA.append(y)   # don't need to repeat y calc?

您希望跳过此item而不是y上的一些新迭代。当我使用你的语法时,我陷入了无限循环,我不得不杀死它。

In [324]: for item in range(10):
     ...:     while item==5:
     ...:         continue
     ...:     else:
     ...:         print(item)
     ...:         
0
1
2
3
4
<infinite loop>

您的代码不会卡住,因为y==nan始终为False

更正了迭代次数:

In [1]: alist=[]
In [2]: for item in range(10):
   ...:     if item==5:
   ...:         continue
   ...:     else:
   ...:         alist.append(item)

In [4]: alist
Out[4]: [0, 1, 2, 3, 4, 6, 7, 8, 9]

替代continue块。

for item ...
    y = ....
    if not np.isnan(y):
       newList.append(y)

答案 1 :(得分:0)

这是另一个有效的解决方案。它产生可预测长度的输出(等于输入&#39;)

import random
import numpy as np
from numpy import log 


def Compute(ListA):
    NewListA = []
    for item in ListA:
        u=np.exp(-(float(item)/500)**1.2)
        p = random.random()
        y=500*((np.log(1/(u*(1-p))))**(1/1.2))
        while np.isnan(y):
            p = random.random()
            y=500*((np.log(1/(u*(1-p))))**(1/1.2))
        NewListA.append(y)
    return NewListA

ListA = [2.00345, 0.004, 3.0876, 6.00034, 8.0777, 9.444, 0.0004, 11.000678]
print (Compute(ListA))

答案 2 :(得分:0)

这里是问题的答案。保罗说,我认为保持while循环更合适。但这两个代码都有效。 。 。感谢你们。

import random
import numpy as np
from numpy import log 

def Compute2(ListA):
    NewListB = []
    p = random.random()   
    for item in ListA:
        u=np.exp(-(float(item)/500)**1.2)
        y=500*((np.log(1/(u*(1-p))))**(1/1.2))
        while np.isnan(y):   
            continue      
        else:
            y=500*((np.log(1/(u*(1-p))))**(1/1.2))
            NewListB.append(y)                      
    return NewListB

ListB = [2.00345, 0.004, 3.0876, 6.00034, 8.0777, 9.444, 0.0004, 11.000678]
print (Compute2(ListB))

答案 3 :(得分:-1)

在python shell中尝试以下

np.nan == np.nan

查看结果,然后考虑这对您的while循环意味着什么。

提示:有一个isnan函数是有原因的。

你的另一个麻烦不是nan相关的。实际上,你提出的版本并不是那么遥远。 您希望Compute函数为原始列表中的每个值计算新值。新值具有随机分量,但也取决于旧值的某些公式。

要实现您已正确设置将旧列表作为参数的函数。您在函数开头正确地初始化了新列表,并且正确地在旧列表上开始循环。

现在出现了第一个问题:您需要为循环的每个元素添加一个新的随机数。循环是本地的,它们只适用于里面。 python里面的意思是在带有for语句的行后面的缩进块中。因此:

- where has the line marked (1) to be placed?

由于你的nan问题,你必须在接受它之前检查每个新值,只要它是nan,你就必须重复计算新值。为此你设置了一个while循环。只要新值为nan,就应该重复这一过程。但正如我们所讨论的,你无法与nan相提并论。 nan代表“不是数字”。现在两件都不是数字的东西不一定相等。因此,将nan与nan或任何东西进行比较永远不会返回True。为了能够检查nan,还有一个名为isnan的专用函数。你必须在这里使用它。因此

- how must the line marked (2) be modified?

continue语句是胡说八道。你没有设置while循环只是为了跳出第一个角落。循环的目的是重新计算新值,因此必须绘制一个新的随机数并再次进行计算。因此

- which two lines do you have to copy and use to replace the bogus continue statement marked (3)?

不需要else子句,将其删除。您现在处于for循环的末尾,内部while循环已终止。请记住,当且仅当循环条件为False时才会发生这种情况。

- what does that mean for `y`? Can it still be `nan` at this point?

根据最后一个答案,下两个行动中只有一个是有意义的:a)计算新的y,b)接受当前的y并将其存储在输出列表中,因此

- which of the lines (4, 5) do you need to keep, which do you need to delete?

不要忘记将这一行取消一个级别;否则计算机会认为它属于while循环。

恭喜,您的程序现在应该运行。

import random
import numpy as np
from numpy import log 


def Compute(ListA):
    NewListA = []
    p = random.random()  # (1)
    for item in ListA:
        u=np.exp(-(float(item)/500)**1.2)
        y=500*((np.log(1/(u*(1-p))))**(1/500))
        while y == nan:  # (2)
            continue     # (3)
        else:
            y=500*((np.log(1/(u*(1-p))))**(1/500))  # (4)
            NewListA.append(y)                      # (5)
    return NewListA

ListA = [2.00345, 0.004, 3.0876, 6.00034, 8.0777, 9.444, 0.0004, 11.000678]
print (Compute(ListA))