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 вопроса
Стоит рассмотреть альтернативу работе со списком. Скорость будет сопоставимой, если не лучше, чем методы массива. Массивы dtype объектов по своей природе медленнее, чем числовые.