有人可以帮我吗?我试图在我的结果列表中避免使用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))
答案 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))