python / numpy多功能最大功能

时间:2016-07-11 10:42:43

标签: python numpy max

在Python中(可能包括numpy)有各种maximummaxamax函数,这些函数在某些程度上也包含在一些StackOverflow问题中,但它们似乎都没有解决了计算混合参数的最大值的相当明显的需求,即匹配以下要求:

  • 任何参数都可以是可迭代的(元组,列表,numpy数组)或只是一个数字
  • ...并且递归地,即任何可迭代可以依次包含数字和可迭代
  • iterables结果为空,无项,不应影响最大
  • 仅当所有参数都为空时,输出应为给定的默认值
  • 如果任何参数包含NaN,那么应该传播(我认为这将是自动的)

我正在从pythonic的角度寻求一种多功能,紧凑且正确的解决方案。

NB。我试着自己编写代码,但收效甚微。我不会附加许多尝试,因为它们看起来很丑陋,也不起作用,而且最重要的是,我认为这对你们可能有所帮助的人来说会产生误导和浪费时间。这个问题已经太长了。

无论如何,这是我的一次尝试,但不起作用:

<!-- language: python -->

def flexMax1(aa):
    '''
    works on one argument, breaks it up into:
    - empties: eliminated
    - single numbers: replace with their max (or None)
    - iterables (if any): deal with recursively, don't forget to add the prev calc max
    '''
    # progressively replaces iterables with their max (or None if no iterables)
    M=None
    while aa:
        if M is not None:
            aa=aa.append(M)
        # eliminates empties and None, but preserves true zeros
        aa= [a for a in aa if a or a==0]

        try:
            # max of non iterables
            M=max( a for a in aa if not iterable(a) )
        except ValueError: # it is an empty sequence 
            # there weren't bare numbers, only iterables, reduce them
            aa=[ flexMax1(a) for a in aa if iterable(a) ]
        else:
            # do same, then will append the max of the iterables
            aa=[ (flexMax1(a)) for a in aa if iterable(a) ]

    return M

if __name__ == '__main__':
    print(flexMax1([1]))
    print(flexMax1([1,2]))
    print(flexMax1([1,[2,3]]))

PS。我知道,从另一个角度来看,某些项目的最大值应该是其中一项,这可以通过使用max的{​​{1}}可选参数来解决。我需要的只是返回总体最大数量

1 个答案:

答案 0 :(得分:0)

您可以先将所有内容展平并计算出最大值:

import collections

def flatted(data):
    if isinstance(data, collections.Iterable):
        for element in data:
            yield from flatted(data)
    else:
        yield data

def versatile_max(data, max_function=max):
    max_function(flatted(data))