【问题标题】:How to find max values from multiple lists?如何从多个列表中找到最大值?
【发布时间】:2012-04-25 03:39:29
【问题描述】:

我有多个相同大小的列表(或 numpy 数组),我想返回一个大小相同的数组,每个点都具有最大值。

例如,

A = [[0,1,0,0,3,0],[1,0,0,2,0,3]]
B = [[1,0,0,0,0,4],[0,5,6,0,1,1]]
C = numpy.zeros_like(A)
for i in xrange(len(A)):
    for j in xrange(len(A[0])):
        C[i][j] = max(A[i][j],B[i][j])

结果是C = [[1,1,0,0,3,4],[1,5,6,2,1,3]]

这很好用,但效率不高——尤其是对于我拥有的数组大小和需要比较的数组数量。我怎样才能更有效地做到这一点?

【问题讨论】:

    标签: python performance list numpy max


    【解决方案1】:

    如果您需要比较超过 2 个数组,您可以执行以下操作

    from numpy import random, dstack
    
    A = random.random((2,5))
    B = random.random((2,5))
    C = random.random((2,5))
    
    stacked_arrays = dstack((A,B,C))
    max_of_stack = stacked_arrays.max(2)
    

    dstack 会将您的 2D 数组转换为 2D 数组的 3D 堆栈

    max 括号内的 2 沿第三轴执行最大操作,这是dstack 为我们创建的新轴

    这将扩展到任意数量的相同大小的二维数组

    【讨论】:

    • 这是个不错的选择!
    【解决方案2】:

    类似:

    numpy_arrays = [A, B, C]
    
    result = [max(elem) for elem in zip(*numpy_arrays)]
    

    ?

    【讨论】:

    • 我认为没有必要在max 中解压elem。否决票不是我。
    • 确实,它不是 - max 和 min 适用于多个参数或序列 -
    【解决方案3】:

    使用numpy.maximum:

    numpy.maximum(x1, x2[, out])
    数组的元素最大值 元素。

    比较两个数组并返回一个包含元素的新数组 最大值。如果要比较的元素之一是 nan,那么 返回元素。如果两个元素都是nans,那么第一个是 回来。后一种区别对于复杂的 nan 很重要,它 被定义为实部或虚部中的至少一个是 南最终效果是传播了 nan。

    【讨论】:

    • 谢谢!我不确定我是如何忽略该功能的。
    • 如果你需要超过 2 个参数,numpy.maximum.reduce([x1,x2,x3...])
    【解决方案4】:

    非 Numpy 解决方案

    >>> [map(max,a,b,c) for a,b,c in zip(A,B,C)]
    [[1, 1, 0, 0, 3, 4], [1, 5, 6, 2, 1, 3]]
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2022-12-24
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多