Заменить значение None списком в массиве np - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь заменить значение None в массиве numpy списком из одного элемента внутри массива np:

data_inputs = np.array([[1], [2], [3], [None], None])
data_inputs = np.where(array == None, [5], data_inputs)

Я получаю следующие результаты:

   np.array([[1], [2], [3], [5], 5])

Я хочу, чтобы следующие результаты:

   np.array([[1], [2], [3], [5], [5]])

Ответы [ 3 ]

1 голос
/ 04 ноября 2019
In [132]: x = np.array([[1], [2], [3], None])                                   

замена элемента простым индексом работает:

In [133]: x[3]=[5]                                                              
In [134]: x                                                                     
Out[134]: array([list([1]), list([2]), list([3]), list([5])], dtype=object)

Нахождение элемента None:

In [135]: x = np.array([[1], [2], [3], None])                                   
In [136]: x==None                                                               
Out[136]: array([False, False, False,  True])

Часто мы говорим использовать is None вместо этого, но этоне работает с массивами. Здесь я подозреваю, что при проверке массива объектов может выполняться поиск идентификатора. Таким образом, этот тест является предварительным.

Мы можем использовать логическую маску, чтобы найти x:

In [137]: x[x==None]                                                            
Out[137]: array([None], dtype=object)
In [138]: x[x==None]=[5]                                                        
In [139]: x                                                                     
Out[139]: array([list([1]), list([2]), list([3]), 5], dtype=object)

Но это ставит номер, а не список;Я подозреваю, что это потому, что Out[137] возвращает 1d массив.

Ваш where, вероятно, близок к этому использованию np.nonzero (псевдоним np.where):

In [142]: x = np.array([[1], [2], [3], None])                                   
In [143]: idx = np.nonzero(x==None)                                             
In [144]: idx                                                                   
Out[144]: (array([3]),)
In [145]: x[idx]                                                                
Out[145]: array([None], dtype=object)

Если мы извлекаем скалярный индекс из idx, он работает:

In [146]: x[idx[0][0]]                                                          
In [147]: x[idx[0][0]] = [5]                                                    
In [148]: x                                                                     
Out[148]: array([list([1]), list([2]), list([3]), list([5])], dtype=object)

Таким образом, я могу заменить один элемент массива объектов списком при условии, что я использую скалярный индекс, а не список, логический индекс или индекс массива. Я не уверен, что нам следует делать, если в примере было несколько None.

В сумме существует 2 вопроса

  • , достоверно идентифицирующих None

  • замена элемента массива объектов списком.

Стоит рассмотреть альтернативу работе со списком. Скорость будет сопоставимой, если не лучше, чем методы массива. Массивы dtype объектов по своей природе медленнее, чем числовые.

0 голосов
/ 04 ноября 2019

Существует следующий слегка эзотерический трюк: заверните список в массив 0D.

data_inputs = np.array([[1], [2], [3], None])
# create 0D object array
# can't do np.array([5],object) for obvious reasons, instead
aux = np.array(None)
aux[()] = [5]

# and now
np.where(data_inputs == None, aux, data_inputs)
# array([list([1]), list([2]), list([3]), list([5])], dtype=object)
0 голосов
/ 04 ноября 2019

Первая строка предоставленного вами кода не запускается, поэтому я предполагаю, что вы имели в виду

data_inputs = np.array([[1], [2], [3], None])

Согласно numpy docs , numpy.where не отличается отпонимание списка, когда все массивы 1D.

Это означает, что вы можете решить это с помощью

np.array([ [5] if d is None else d for d in data_inputs ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...