为什么 numpy.ndarray 允许 "None" 数组?
Why does numpy.ndarray allow for a "None" array?
我想知道 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
数组(不是无数组),这似乎强制对变量 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
被接受为 "array-like" 因为它不是上面列出的任何一个?
以此类推,list(None)
将 return 出错,因为根据文档 None
不是 "iterable"。
此外,某些函数似乎实际上 return 看似不正确的值。例如 np.ndarray.argmax()
或 np.ndarray.argmin()
实际上 return 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
相对于空数组 (array([], dtype=object)
),"None array" (array(None, dtype=object)
) 真的有什么优势吗?
这是预期的功能,还是 Nones
是实际对象的意外结果?有人能解释一下引擎盖下发生了什么以及为什么吗?
非常感谢!
你用 np.asarray(None)
得到的是一个形状为 ()
的数组,它是一个 scalar,数据类型为 object
。如果您执行 np.asarray(2)
或 np.asarray('abc')
,您会得到类似的结果。标量不能迭代,但可以与非 NumPy 值进行比较。同时,你可以用它们进行 NumPy 操作,所以你可以这样做:
list(np.asarray(None).reshape((1,)))
而且有效。
关于 argmin
或 argmax
等函数。请注意,标量不为空。形状为 ()
的数组只有一个元素,但维度为零,而形状为 (0,)
的数组只有一维,没有元素。这可能是违反直觉的,但它是有道理的,而且也能让事情发挥作用。如文档所述,argmin
和 argmax
,当没有给出 axis
值时,在展平数组上工作。标量的展平数组(例如 np.asarray(None).ravel()
)是一个形状为 (1,)
的数组,并且由于您要求的是最小值或最大值的索引并且它只有一个值,因此答案是0
在这两种情况下。有趣的是,如果你尝试 np.argmin(np.asarray([None, None]))
它会失败,因为现在你有两个元素,你需要比较它们才能知道哪个是最小的,但你不能比较 None
值。
I was wondering what is the rationale for the following functionality of numpy.ndarray:
NumPy 允许 0 维数组,并且它允许 object
dtype 的数组。总之,这些事实意味着任何对象都可以解释为类似 object
dtype 的 0 维数组,这就是 numpy.array
将如何解释它无法找到其他解释方式的任何参数。这就是这里发生的事情。
你得到的是一个 0 维 1 元素数组,其第 1 个元素是 None。
In [12]: x = numpy.array(None)
In [13]: x.shape
Out[13]: ()
In [14]: x.size
Out[14]: 1
In [15]: print(x.item())
None
So in this case Python seems to actually create a None array (not array of Nones)
不是,是None的数组。它是恰好一个 None 的数组。您可以通过提供一个没有索引的元组,或者通过调用 item()
方法,或者通过一系列其他方式来访问 None。
In [15]: print(x.item())
None
In [16]: print(x[()])
None
So why is None accepted as "array-like" since it is not any of the listed above?
该列表并非详尽无遗。
Furthermore, some functions seem to actually return seemingly incorrect values. For example np.ndarray.argmax() or np.ndarray.argmin() actually return 0 for a "None array", but result in an error for an empty array which intuitively seems like the expected behaviour.
如果您不提供 axis
参数,argmax
和 argmin
默认处理扁平化的输入形式。 0
是您的 0 维数组的扁平形式的唯一元素的索引。
In [23]: y = x.ravel()
In [24]: y
Out[24]: array([None], dtype=object)
In [25]: y.argmin()
Out[25]: 0
In [26]: y.argmax()
Out[26]: 0
In [27]: print(y[0])
None
我想知道 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
数组(不是无数组),这似乎强制对变量 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
被接受为 "array-like" 因为它不是上面列出的任何一个?
以此类推,list(None)
将 return 出错,因为根据文档 None
不是 "iterable"。
此外,某些函数似乎实际上 return 看似不正确的值。例如 np.ndarray.argmax()
或 np.ndarray.argmin()
实际上 return 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
相对于空数组 (array([], dtype=object)
),"None array" (array(None, dtype=object)
) 真的有什么优势吗?
这是预期的功能,还是 Nones
是实际对象的意外结果?有人能解释一下引擎盖下发生了什么以及为什么吗?
非常感谢!
你用 np.asarray(None)
得到的是一个形状为 ()
的数组,它是一个 scalar,数据类型为 object
。如果您执行 np.asarray(2)
或 np.asarray('abc')
,您会得到类似的结果。标量不能迭代,但可以与非 NumPy 值进行比较。同时,你可以用它们进行 NumPy 操作,所以你可以这样做:
list(np.asarray(None).reshape((1,)))
而且有效。
关于 argmin
或 argmax
等函数。请注意,标量不为空。形状为 ()
的数组只有一个元素,但维度为零,而形状为 (0,)
的数组只有一维,没有元素。这可能是违反直觉的,但它是有道理的,而且也能让事情发挥作用。如文档所述,argmin
和 argmax
,当没有给出 axis
值时,在展平数组上工作。标量的展平数组(例如 np.asarray(None).ravel()
)是一个形状为 (1,)
的数组,并且由于您要求的是最小值或最大值的索引并且它只有一个值,因此答案是0
在这两种情况下。有趣的是,如果你尝试 np.argmin(np.asarray([None, None]))
它会失败,因为现在你有两个元素,你需要比较它们才能知道哪个是最小的,但你不能比较 None
值。
I was wondering what is the rationale for the following functionality of numpy.ndarray:
NumPy 允许 0 维数组,并且它允许 object
dtype 的数组。总之,这些事实意味着任何对象都可以解释为类似 object
dtype 的 0 维数组,这就是 numpy.array
将如何解释它无法找到其他解释方式的任何参数。这就是这里发生的事情。
你得到的是一个 0 维 1 元素数组,其第 1 个元素是 None。
In [12]: x = numpy.array(None)
In [13]: x.shape
Out[13]: ()
In [14]: x.size
Out[14]: 1
In [15]: print(x.item())
None
So in this case Python seems to actually create a None array (not array of Nones)
不是,是None的数组。它是恰好一个 None 的数组。您可以通过提供一个没有索引的元组,或者通过调用 item()
方法,或者通过一系列其他方式来访问 None。
In [15]: print(x.item())
None
In [16]: print(x[()])
None
So why is None accepted as "array-like" since it is not any of the listed above?
该列表并非详尽无遗。
Furthermore, some functions seem to actually return seemingly incorrect values. For example np.ndarray.argmax() or np.ndarray.argmin() actually return 0 for a "None array", but result in an error for an empty array which intuitively seems like the expected behaviour.
如果您不提供 axis
参数,argmax
和 argmin
默认处理扁平化的输入形式。 0
是您的 0 维数组的扁平形式的唯一元素的索引。
In [23]: y = x.ravel()
In [24]: y
Out[24]: array([None], dtype=object)
In [25]: y.argmin()
Out[25]: 0
In [26]: y.argmax()
Out[26]: 0
In [27]: print(y[0])
None