Что вызывает "ValueError: не могу преобразовать число с плавающей запятой в целое число" в моей функции - PullRequest
1 голос
/ 27 июня 2019

Я создал эту функцию:

import numpy as np 


def npp_tool(pb_opt, chlor_a, daylight, irrFunc, z_eu):
            if daylight == 0 or daylight == np.nan:
                return -32767
            elif pb_opt == np.nan:
                return -32767
            elif chlor_a == -32767 or daylight == np.nan:
                return -32767
            elif irrFunc == np.nan:
                return -32767
            elif z_eu == np.nan:
                return -32767
            else:
                return pb_opt * chlor_a * daylight * irrFunc * z_eu

, которая преобразует значения np.nan во входных данных в целые числа

npp_vec = np.vectorize(npp_tool)
npp = npp_vec(pb_opt, chlor_a, daylight, irrFunc, z_eu)

Но когда я запускаю приведенный выше код, я все равно получаю ошибкусообщение «ValueError: невозможно преобразовать число с плавающей запятой в целое число»:

"---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-27-7ad956e7f0a2> in <module>
----> 1 npp = npp_vec(pb_opt, chlor_a, daylight, irrFunc, z_eu)

~\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs)
   2089             vargs.extend([kwargs[_n] for _n in names])
   2090 
-> 2091         return self._vectorize_call(func=func, args=vargs)
   2092 
   2093     def _get_ufunc_and_otypes(self, func, args):

~\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args)
   2168 
   2169             if ufunc.nout == 1:
-> 2170                 res = array(outputs, copy=False, subok=True, dtype=otypes[0])
   2171             else:
   2172                 res = tuple([array(x, copy=False, subok=True, dtype=t)

ValueError: cannot convert float NaN to integer" 

Что я делаю неправильно в своей функции, чтобы вызвать это?

1 Ответ

3 голосов
/ 27 июня 2019

Вы не можете сравнить np.nan с np.nan, используя ==

, вы должны использовать np.isnan:

, поэтому измените все свои сравнения на:

elif np.isnan(pb_opt):

и т. Д.

например:

In[71]:
np.nan==np.nan

Out[71]: False

Таким образом, приведенное выше сравнение не выполняется, в то время как isnan работает:

In[73]:
np.isnan(np.nan)

Out[72]: True

NaN обладает свойством, которое нельзя сравнивать с самим собой:

In[73]:
np.nan != np.nan

Out[73]: True
...