【问题标题】:Why does np.argmax(None) return 0 and not throw an Exception?为什么 np.argmax(None) 返回 0 而不会抛出异常?
【发布时间】:2021-06-30 17:29:27
【问题描述】:

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

如果数组是一个空列表,我们会得到一个ValueError Exception

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

ValueError: 尝试获取空序列的 argmax

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

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

0

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


我的问题:

  1. 由于None 不是数组,为什么它不返回异常?
  2. 为什么返回 0?

【问题讨论】:

    标签: python python-3.x python-2.7 numpy argmax


    【解决方案1】:

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

    如果您没有传递axis,argmax 会将输入视为展平,因此您的调用等效于numpy.argmax(numpy.array([None]))None 不可比较,但 numpy 不知道这一点,因为它与 None 没有什么可比较的 - 只有一个输入元素,并且默认情况下该输入元素被认为是最大值。 argmax 返回 0,这是展平输入中唯一元素的索引。

    【讨论】:

    • 我不知道“类数组”的定义,谢谢!您能否在此声明 ...which is considered a 0-dimensional array-like of object dtype 上扩展(或发布来源)?我想了解更多。
    • @ihavenoidea:尝试在None 上调用asarray,您将得到一个具有object dtype 的0 维数组。
    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2014-06-22
    • 2012-04-06
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多