python - 为什么 numpy.ndarray 允许 "None"数组?

标签 python arrays numpy nonetype 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 数组(不是 Nones 数组),这似乎在变量 a 上强制执行了一个类型。但是文档指出位置参数需要是“array_like”:

a : array_like

Input data, in any form that can be converted to an array. This includes lists, lists of tuples, tuples, tuples of tuples, tuples of lists and ndarrays.

那么为什么 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([], dtype=object ))?

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

非常感谢!

最佳答案

np.asarray(None) 得到的是一个形状为 () 的数组,它是一个 scalar , 数据类型 object。如果您执行 np.asarray(2)np.asarray('abc'),您会得到类似的结果。标量不能迭代,但可以与非 NumPy 值进行比较。同时,您可以使用它们进行 NumPy 操作,因此您可以:

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

而且有效。

关于 argminargmax 等函数。请注意,标量不为空。形状为 () 的数组只有一个元素,但维度为零,而形状为 (0,) 的数组只有一维,没有元素。这可能是违反直觉的,但它是有道理的,而且也能让事情发挥作用。如文档所述,argminargmax,当没有给出 axis 值时,将处理展平数组。标量的扁平数组(例如 np.asarray(None).ravel())是一个形状为 (1,) 的数组,并且,由于您要求最小值或最大值的索引并且它只有一个值,在这两种情况下答案都是 0。有趣的是,如果你尝试 np.argmin(np.asarray([None, None])) 它会失败,因为现在你有两个元素,你需要比较它们才能知道哪个是最小的,但您无法比较 None 值。

关于python - 为什么 numpy.ndarray 允许 "None"数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186190/

相关文章:

python - mod-wsgi 和 apache 和 Pyramid (pylons 项目)

java - 自动向数组添加元素

python - 时间序列 python(numpy 或 pandas)的线性回归

python - 如何计算 Numpy 数组中每个零左边的零个数

python - 如何让 Selenium 等到找到元素而不是使用 time.sleep()

python - 如何构建和部署 Python Web 应用程序

python - 如何将 url 值传递给 Scrapy 爬取中的所有后续项目?

arrays - Go语言中的数组比较

java - 使用其中的乘法从另一个数组填充一个数组

python - 如何在空值上折叠 pandas 中的列?