【问题标题】:How to Check list containing NaN如何检查包含 NaN 的列表
【发布时间】:2013-12-17 15:50:54
【问题描述】:

在我的 for 循环中,我的代码生成了一个类似这样的列表:

list([0.0,0.0]/sum([0.0,0.0]))

循环生成各种其他数字向量,但它也生成[nan,nan],为了避免它,我尝试像下面的那样放入一个条件来防止它,但它不返回true。

nan in list([0.0,0.0]/sum([0.0,0.0]))
>>> False

它不应该返回 true 吗?

我已加载的库:

import PerformanceAnalytics as perf
import DataAnalyticsHelpers
import DataHelpers as data
import OptimizationHelpers as optim
from matplotlib.pylab import *
from pandas.io.data import DataReader
from datetime import datetime,date,time
import tradingWithPython as twp
import tradingWithPython.lib.yahooFinance as data_downloader # used to get data from yahoo finance
import pandas as pd # as always.
import numpy as np
import zipline as zp
from scipy.optimize import minimize
from itertools import product, combinations
import time
from math import isnan

【问题讨论】:

  • 这不是一个有效的代码——它应该给出一个错误,因为你不能将列表除以浮点数。
  • 适用于我的,并返回 false。 Anaconda 2.7.3 Python
  • 您确定在加载任何库之前看到此内容吗?因为在标准 Python 2.7 中这是非法操作。以及只能来自某些 from ... import * 的 NaN。这可能是您的口译员的功能,因此请将此信息添加到问题中。
  • 除了我的观点之外,numpy.nan in [numpy.nan, numpy.nan] 应该返回 true。我不知道你的 nan 来自哪里 - 我猜这是你正在加载的某个库,因为它不是标准的 Python 功能。
  • 我明白你的意思,我同意。你有没有看到我加载的任何导致这种情况的库。前 4 个库是自定义库,它们本身加载相同的内容。

标签: python


【解决方案1】:

也许这就是你要找的……

a = [2,3,np.nan]
b = True if True in np.isnan(np.array(a)) else False
print(b)

【讨论】:

    【解决方案2】:

    我认为这是有道理的,因为您通过星号导入间接将 numpy 拉入范围。

    >>> import numpy as np
    >>> [0.0,0.0]/0
    Traceback (most recent call last):
      File "<ipython-input-3-aae9e30b3430>", line 1, in <module>
        [0.0,0.0]/0
    TypeError: unsupported operand type(s) for /: 'list' and 'int'
    
    >>> [0.0,0.0]/np.float64(0)
    array([ nan,  nan])
    

    什么时候做的

    from matplotlib.pylab import *
    

    它拉入numpy.sum

    >>> from matplotlib.pylab import *
    >>> sum is np.sum
    True
    >>> [0.0,0.0]/sum([0.0, 0.0])
    array([ nan,  nan])
    

    您可以通过身份测试 this nan 对象(nan 通常不是唯一的)是否在列表中,但如果您在 array 中尝试它似乎通过相等测试,nan != nan:

    >>> nan == nan
    False
    >>> nan == nan, nan is nan
    (False, True)
    >>> nan in [nan]
    True
    >>> nan in np.array([nan])
    False
    

    你可以使用np.isnan:

    >>> np.isnan([nan, nan])
    array([ True,  True], dtype=bool)
    >>> np.isnan([nan, nan]).any()
    True
    

    【讨论】:

      【解决方案3】:

      您应该使用math 模块。

      >>> import math
      >>> math.isnan(item)
      

      【讨论】:

      • math.isnan 需要 float,而不是可迭代的。如果你坚持使用math,你应该使用any([math.isnan(x) for x in items])。请注意,numpy 应该更快。
      • @Raf 你是对的。我在中断的迭代中使用了没有底条的条形图。我必须插入一个白色的隐藏条,保存 SVG,然后使用上面的代码再试一次,它就起作用了。谢谢!
      猜你喜欢
      • 2021-10-29
      • 2017-01-03
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2013-10-13
      • 2022-11-21
      • 2011-08-17
      相关资源
      最近更新 更多