numpy.max函数是做什么用的?

3

我看到了一段代码,代码如下:

while numpy.max(abs(A - B)) > 0.01:

我想要用一些常规的Python(数学?)函数替换numpy.max,但我不知道numpy.max到底是做什么的。
我尝试过谷歌搜索,但只找到了:numpy.maximum,这似乎不同于numpy.max
还有:numpy.amax,这也不是我需要的。
有人知道如何将这个numpy.max函数复制到一些标准的Python函数中吗?
编辑:我正在使用Python 2.7。

1
根据这条旧消息,"numpy.max存在是出于历史原因"。 - BrenBarn
2个回答

5

numpy.maxnumpy.amax是相同的:

>>> import numpy
>>> numpy.max # Notice it says 'amax' in the output
<function amax at 0x0228B5D0>
>>> numpy.max is numpy.amax
True
>>>

或者更具体地说,maxamax函数的别名。
这个函数的目的在您提供的文档链接中已列出,但似乎主要用于找到一个numpy.array中的最大值,而不管它有多少层嵌套。您可以使用一个简单的函数来展平列表以模仿这种行为:
def flatten(lst):
    for item in lst:
        if isinstance(item, list):
            # Use 'yield from flatten(item)' in Python 3.3 or greater
            for sub_item in flatten(item):
                yield sub_item
        else:
            yield item

内置的max函数

max(flatten(my_list))

以下是演示:

>>> def flatten(lst):
...     for item in lst:
...         if isinstance(item, list):
...             for sub_item in flatten(item):
...                 yield sub_item
...         else:
...             yield item
...
>>> array = [[1, 2, 3], [4, 5, 6]]
>>> max(flatten(array))
6
>>>

请注意,此处的 yield from 依赖于 Python 3.3 或更高版本。 - ely
真的。OP没有说他使用的是哪个版本,所以我更喜欢使用最新的版本。但如果有人运行旧版本,只需用普通的for循环替换yield fromfor i in flatten(item): yield i - user2555451
这是一个不错的选择,但大多数围绕NumPy构建的项目仍然使用2.7版本,并且将长期如此。NumPy本身在Python 3中运行良好,但是许多相关的库和工具并不支持,这对于许多以NumPy为中心的项目来说是一个严重的问题。 - ely
谢谢回复。但现在我更加困惑了,因为最初的“ A”和“ B”实际上是浮点数而不是数组: https://github.com/Sandia-Labs/PVLIB_Python/blob/master/pvlib/pvl_ephemeris.py#L128 - marco
2
@iCodez - 该函数似乎是编写用于数组或标量的。在该代码示例中,EccenAnom可以是一个数组,而不仅仅是一个标量。(请注意,函数的输入都被记录为类似于数组的对象。任何涉及时间或日期的内容都将是一个数组,例如T1)。另外,np.min(2.0)返回一个标量(实际上是一个numpy浮点数,而不是传入的python浮点数),原因是numpy函数被概括为适用于任何形状或大小的数组,包括长度为0的数组。这是numpy的一种模式。没有理由为min打破它。 - Joe Kington

1

如果您的代码中的AB是多维数组,则很难在纯Python中复制np.max的行为,因为多维数组在Python中不是标准的。建议保留NumPy函数。

对于平坦(一维)数组,Python的maxnp.max执行相同的操作,可以相互交换:

>>> a = np.arange(27)
>>> max(a)
26
>>> np.max(a)
26

对于多维数组,max 无法使用:
>>> a = a.reshape(3, 3, 3)
>>> max(a)
ValueError: The truth value of an array with more than one element is ambiguous [...]
>>> np.max(a)
26

默认情况下,np.max 将三维数组扁平化并返回最大值。(您还可以沿着特定轴查找最大值等。)Python 的 max 无法做到这一点。
要替换 np.max,您需要在数组的轴上编写嵌套循环;实际上是尝试在嵌套列表的列表中查找最大值。这当然是可能的,但很可能非常慢:
>>> max([max(y) for y in x for x in a])
26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接