为什么 np.argmax(None) return 0 而不是抛出异常?

Why does np.argmax(None) return 0 and not throw an Exception?

根据Numpy's argmax documentation,我们传递给np.argmax的第一个参数必须是一个数组。

如果数组是空列表,我们得到 ValueError Exception:

import numpy as np
print(np.argmax([]))

ValueError: attempt to get argmax of an empty sequence

但是,如果我们将 None 作为第一个参数传递给 np.argmax,我们将得到 0 作为输出。

import numpy as np
print(np.argmax(None))

0

我觉得很奇怪,当它传递一个数组(虽然是空的,但仍然是一个数组)给 np.argmax 我们得到一个异常但是当它被传递时 NOT数组 (None) 程序运行无误。


我的问题:

  1. 为什么 return 不是异常,因为 None 不是数组?
  2. 为什么 return 0?

numpy.argmax 的输入 不是 数组所必需的 - 您误读了文档。输入是一个 类数组 ,结果几乎没有限制输入。几乎任何东西都是类数组,包括 None,它被认为是 object dtype 的 0 维类数组。 “类数组”并没有限制输入,而是真正描述了输入将如何被解释——如果一个参数被记录为类数组,NumPy 将尝试将其视为一个数组,通常相当于一个 asarray打电话。

如果您不传递 axis,argmax 会将输入视为扁平化,因此您的调用等同于 numpy.argmax(numpy.array([None]))None 没有可比性,但是 numpy 不知道这一点,因为它没有什么可以与 None 进行比较 - 只有一个输入元素,并且那个输入元素被认为是最大的默认。 argmax returns 0,扁平化输入中唯一元素的索引。