Звучит так, как будто у вас длинный список массивов, некоторые из которых могут содержать np.nan
.Давайте сделаем небольшой тестовый пример:
In [617]: alist = [np.array([.1,.2,np.nan]), np.array([2,3,.2]), np.ones(3), np.zeros(3), np.array([np.nan,.1,2])]
In [618]: alist
Out[618]:
[array([0.1, 0.2, nan]),
array([2. , 3. , 0.2]),
array([1., 1., 1.]),
array([0., 0., 0.]),
array([nan, 0.1, 2. ])]
Мы можем проверить nan
в одном из этих массивов:
In [619]: np.isnan(alist[0])
Out[619]: array([False, False, True])
Мы можем перебрать массивы и распечатать те, которыеhave nan
:
In [620]: for i,a in enumerate(alist):
...: idx = np.where(np.isnan(a))[0]
...: if len(idx):print(i,idx)
...:
0 [2]
4 [0]
Если все массивы имеют одинаковую длину, мы можем объединить их в один двумерный массив:
In [621]: arr = np.stack(alist)
In [622]: arr
Out[622]:
array([[0.1, 0.2, nan],
[2. , 3. , 0.2],
[1. , 1. , 1. ],
[0. , 0. , 0. ],
[nan, 0.1, 2. ]])
In [623]: np.isnan(arr)
Out[623]:
array([[False, False, True],
[False, False, False],
[False, False, False],
[False, False, False],
[ True, False, False]])
In [624]: _.any(axis=1) # check for rows with a nan
Out[624]: array([ True, False, False, False, True])
In [625]: np.where(_)
Out[625]: (array([0, 4]),)
или where
, примененный ко всему массиву:
In [626]: np.where(np.isnan(arr))
Out[626]: (array([0, 4]), array([2, 0]))
Я могу воспроизвести ваше сообщение об ошибке с:
In [627]: for i in alist[0]:
...: a = alist[i]
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-627-b5ff2521aef0> in <module>()
1 for i in alist[0]:
----> 2 a = alist[i]
3
TypeError: list indices must be integers or slices, not numpy.float64
Обратите внимание, что это происходит в строке a = alist[i]
. Вы действительно должны были включить эту информацию в свой вопрос.
i
на данный момент:
In [628]: i
Out[628]: 0.1
первый элемент alist[0]
.Возможно, вам придется пересмотреть, как работает итерация по списку в Python.for i in x:
производит элементы x
, а не индексы.Не имеет смысла следовать этому к x[i]
.for i in range(3): x[i]
в порядке.Так же, как и for i,v in enumerate(x): x[i]
.