2013-12-02 4 views
6

В мой цикл, мой код создает список, как этот:Как проверить список, содержащий NaN

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 

Должно ли оно не возвращаться?

enter image description here

Библиотеки Я нагруженные:

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 
+1

Это не правильный код - он должен давать ошибку, потому что вы не можете разделить список на поплавок. – sashkello

+0

работает на моем, и возвращает false. Anaconda 2.7.3 Python – user1234440

+0

Вы действительно видите это перед загрузкой каких-либо библиотек? Потому что в стандартном Python 2.7 это незаконная операция. Также как NaN, который может исходить только из некоторого 'from ... import *'. Это может быть особенностью вашего переводчика, поэтому, пожалуйста, добавьте эту информацию в вопрос. – sashkello

ответ

9

Я думаю, что это имеет смысл из-за ваши вытягивать 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]) 

Вы можете проверить, что этот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 
+0

отличное объяснение. спасибо @sashkello и себя за детали – user1234440

4

Вы должны использовать math модуль.

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

Возможно, вы могли бы объяснить, почему его код не работает? –

Смежные вопросы