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/

相关文章:

javascript - 如何检查数组中的单词是否存在于给定字符串中

php - 如果等于从数据库检索的值,则选中该复选框

python - onehotencoder 的 sklearn 掩码不起作用

python - 如何导入安装在主目录中的模块?

python - 如何删除 itertools.product 函数的镜像反射值?

python - 编写api时需要一些建议

c++ - 字符数组给出整个数组

python - 在 Python 中使用函数返回子字符串

python - 如何在 python 中选择特定类别的垃圾箱?

python - 为什么使用inspect模块查不到Numpy中conjugate的源码?