首页 > 解决方案 > 为什么 numpy.ndarray 允许“无”数组?

问题描述

我想知道以下功能的基本原理是什么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数组(而不是 None 数组),这似乎强制一个 type over variable a。但是文档指出位置参数需要是“array_like”:

一个:array_like

可以转换为数组的任何形式的输入数据。这包括列表、元组列表、元组、元组的元组、列表的元组和 ndarray。

那么为什么被None接受为“类数组”,因为它不是上面列出的任何一个?

以此类推,list(None)将返回错误,因为None根据文档不是“可迭代”的。

此外,某些函数似乎实际上返回看似不正确的值。例如np.ndarray.argmax(),或者np.ndarray.argmin()实际上为“无数组”返回 0,但会导致空数组出现错误,这直观上看起来像是预期的行为。

>>> 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

array(None, dtype=object)与空数组( )相比,拥有“无数组”()实际上有什么优势array([], dtype=object)吗?

这是预期的功能,还是Nones作为实际对象的意外结果?有人可以解释一下引擎盖下发生了什么,为什么?

非常感谢!

标签: pythonarraysnumpynonetypenumpy-ndarray

解决方案


你得到的np.asarray(None)是一个带有 shape 的数组(),它是一个标量,带有 dtype object。如果你这样做,你会得到类似的东西np.asarray(2)np.asarray('abc')。标量不能迭代,但可以与非 NumPy 值进行比较。同时,您可以使用它们进行 NumPy 操作,因此您可以:

list(np.asarray(None).reshape((1,)))

它有效。

关于argminor之类的功能argmax。请注意,标量不为空。具有形状的数组()只有一个元素,但维度为零,而具有形状的数组(0,)只有一维,没有元素。这可能是违反直觉的,但它是有道理的,也能让事情正常进行。如所记录的,argmin并且argmax,当没有axis给出值时,在展平的数组上工作。标量的展平数组(例如np.asarray(None).ravel())是一个形状为 的数组(1,),并且由于您要求的是最小值或最大值的索引,并且它只有一个值,因此0两种情况下的答案都是。有趣的是,如果你尝试np.argmin(np.asarray([None, None]))失败,因为现在你有两个元素,你需要比较它们才能知道哪个是最小的,但你无法比较None价值观。


推荐阅读