Мне было интересно, что является обоснованием для следующих функций numpy.ndarray
:
>>> a = None
>>> a = np.asarray(a)
array(None, dtype=object)
>>> type(a)
<class 'numpy.ndarray'>
>>> a == None
True
>>> a is None
False
Таким образом, в этом случае Python, кажется, фактически создает массив None
(не массив Nones), который, по-видимому, обеспечивает тип над переменной a
. Но в документации говорится, что позиционный аргумент должен быть «похожим на массив»:
a: array_like
Входные данные в любой форме, которые могут быть преобразованы в массив. Сюда входят списки, списки кортежей, кортежей, кортежей кортежей, кортежей списков и ndarrays.
Так почему None
принимается как "массивоподобный", поскольку он не является ни одним из перечисленных выше?
По аналогии, list(None)
вернет ошибку, потому что None
не является итеративным согласно документации.
Кроме того, некоторые функции, похоже, на самом деле возвращают некорректные значения. Например, np.ndarray.argmax()
или np.ndarray.argmin()
фактически возвращают 0 для «None array», но приводят к ошибке для пустого массива, которая интуитивно выглядит как ожидаемое поведение.
>>> a
array(None, dtype=object)
>>> b
array([], dtype=object)
>>> a.argmax()
0
>>> b.argmax()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: attempt to get argmax of an empty sequence
Есть ли какое-то преимущество в наличии «массива None» (array(None, dtype=object)
) по сравнению с пустым массивом (array([], dtype=object)
)?
Является ли это предполагаемой функциональностью или случайным следствием того, что Nones
является фактическим объектом? Может кто-нибудь объяснить, что здесь происходит под капотом и почему?
Большое спасибо!