【问题标题】:how to use np.max for empty numpy array without ValueError: zero-size array to reduction operation maximum which has no identity如何在没有 ValueError 的情况下将 np.max 用于空 numpy 数组:零大小数组到没有标识的缩减操作最大值
【发布时间】:2020-05-05 04:00:47
【问题描述】:

我遇到一个案例,当我尝试在一个空的 numpy 数组中使用 np.max() 时,它会报告此类错误消息。

# values is an empty numpy array here
max_val = np.max(values)

ValueError: 零大小数组到没有标识的归约操作最大值

所以我认为解决它的方法是在调用np.max() 之前先尝试处理空的numpy数组,如下所示:

# add some values as missing values on purposes.
def deal_empty_np_array(a:np.array):
    if a.size == 0:
        a = np.append(a, [-999999, -999999])

    return a

values = deal_empty_np_array(values)
max_val = np.max(values);

或者使用像link 这样的try catch 方式。

所以我想知道对于这种尴尬的情况是否有更好的解决方案。
提前致谢。

PS: 很抱歉之前没有给出清晰的描述。

【问题讨论】:

  • 对我来说,您的代码没有多大意义,因为第一个:您似乎分配了一些命名列(熊猫数据框?),但 time_diff 将是一个 numpy 数组。第二,你从来没有指定time_dif_rat,这是什么?
  • @NicoAlbers Albers 抱歉,这段代码有错误。我之前在运行的地方已经更正了,但是发布了错误的版本。
  • 你能举一个最低工作(或不工作)的例子吗?看来你还是搞砸了time_diff 是一个数组还是一个数据框?
  • 我不确定这里到底是什么问题。是的,在空数组上调用 numpy.max() 会引发错误。只需检查数组是否为空,如果它不调用max() 就可以了。

标签: python arrays python-3.x numpy


【解决方案1】:
In [3]: np.max([])                                                                               
---------------------------------------------------------------------------
...
ValueError: zero-size array to reduction operation maximum which has no identity

但请查看文档。在较新的 numpy ufunc 中,例如 max 采用 initial 参数,让您可以使用空数组:

In [4]: np.max([],initial=10)                                                                    
Out[4]: 10.0

【讨论】:

  • 太棒了。确定初始值的合适方法是什么?
  • @jtlz2 我敢打赌,没有比“考虑如果输入数组为空时希望函数返回哪个值”更通用的方法。这取决于您的应用程序。
  • 请注意,初始值与 Python 语义中的 default arg 的含义不同。答案可以让 IMO 更好地澄清这一点,因为 cmets 显然具有误导性。初始值包含在最大搜索中,因此np.max(arr, initial) 等价于np.max(np.append(arr, initial))。例如,np.max(np.random.rand(3), initial=10) 将返回 10,这可能不正确,具体取决于您的上下文。
【解决方案2】:

我认为您可以简单地检查它,并最终重新分配它,然后再致电np.max

import numpy as np

values = -999 if values.size==0 else values
max_val = np.max(values)

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 2013-12-27
    • 1970-01-01
    • 2020-04-16
    • 2019-09-02
    • 2018-01-14
    • 2020-12-10
    • 2022-10-20
    相关资源
    最近更新 更多