python - 为什么 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
作为实际对象的意外结果?有人可以解释一下引擎盖下发生了什么,为什么?
非常感谢!
解决方案
你得到的np.asarray(None)
是一个带有 shape 的数组()
,它是一个标量,带有 dtype object
。如果你这样做,你会得到类似的东西np.asarray(2)
或np.asarray('abc')
。标量不能迭代,但可以与非 NumPy 值进行比较。同时,您可以使用它们进行 NumPy 操作,因此您可以:
list(np.asarray(None).reshape((1,)))
它有效。
关于argmin
or之类的功能argmax
。请注意,标量不为空。具有形状的数组()
只有一个元素,但维度为零,而具有形状的数组(0,)
只有一维,没有元素。这可能是违反直觉的,但它是有道理的,也能让事情正常进行。如所记录的,argmin
并且argmax
,当没有axis
给出值时,在展平的数组上工作。标量的展平数组(例如np.asarray(None).ravel()
)是一个形状为 的数组(1,)
,并且由于您要求的是最小值或最大值的索引,并且它只有一个值,因此0
两种情况下的答案都是。有趣的是,如果你尝试np.argmin(np.asarray([None, None]))
失败,因为现在你有两个元素,你需要比较它们才能知道哪个是最小的,但你无法比较None
价值观。