2009-11-25 4 views
14

в качестве восстановительной стоимости для другого в работе с массивами, или как искать внутри массива и заменить значение другихзаменить значения в массиве

, например:

array ([[NaN, 1., 1., 1., 1., 1., 1.] 
     [1., NaN, 1., 1., 1., 1., 1.] 
     [1., 1., NaN, 1., 1., 1., 1.] 
     [1., 1., 1., NaN, 1., 1., 1.] 
     [1., 1., 1., 1., NaN, 1., 1.] 
     [1., 1., 1., 1., 1., NaN, 1.] 
     [1., 1., 1., 1., 1., 1., NaN]]) 

, где он может заменить NaN на 0. спасибо за любой ответ

ответ

29

Вы можете сделать это:

import numpy as np 
x=np.array([[np.NaN, 1., 1., 1., 1., 1., 1.],[1., np.NaN, 1., 1., 1., 1., 1.],[1., 1., np.NaN, 1., 1., 1., 1.], [1., 1., 1., np.NaN, 1., 1., 1.], [1., 1., 1., 1., np.NaN, 1., 1.],[1., 1., 1., 1., 1., np.NaN, 1.], [1., 1., 1., 1., 1., 1., np.NaN]]) 
x[np.isnan(x)]=0 

np.isnan(x) возвращает булевую матрицу, которая равна True где бы то ни было x is NaN. x[ boolean_array ] = 0 использует fancy indexing, чтобы присвоить значение 0, где булев массив равен True.

Для отличного ознакомления с фантастическим индексированием и многое другое, см. Также the numpybook.

+0

NameError: имя «х» не определено не работает – ricardo

+0

@ricardo: Пусть х ваш NumPy массив. – unutbu

+0

привет, отличный ответ, спасибо – ricardo

14

в эти дни есть специальная функция:

a = numpy.nan_to_num(a) 
+0

Просто спас мой бекон, делая в обратном фильтре. [обработка изображения] –

+2

Но это будет включать временную переменную с тем же типом и формой, что и '' 'a''', это будет иметь значение на больших матрицах. – dashesy

+1

@ dashy Начиная с версии 1.13 вы можете сделать это: a = numpy.nan_to_num (a, copy = False) ... Дополнительная информация о параметре 'copy': создать копию x (True) или заменить значения на месте (False). Операция на месте возникает только в том случае, если приведение в массив не требует копии. Значение по умолчанию - True. Новое в версии 1.13. –

0

Вот пример массив в вопросе:

import numpy as np 
a = np.where(np.eye(7), np.nan, 1) 

Вы можете использовать numpy.where и numpy.isnan функции для создания нового массива b:

b = np.where(np.isnan(a), 0, a) 

Или используйте in-pla Функция в.п. напрямую изменить a массив:

np.place(a, np.isnan(a), 0) # returns None