如何从多个列表中查找最大值?

时间:2012-04-12 18:27:50

标签: python performance list numpy max

我有多个相同大小的列表(或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]]

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

4 个答案:

答案 0 :(得分:7)

使用numpy.maximum

  

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

     

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

答案 1 :(得分:5)

非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]]
>>> 

答案 2 :(得分: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执行沿第3轴的最大操作,第3轴是dstack为我们创建的新轴

这将扩展到任意数量的相同大小的2D阵列

答案 3 :(得分:0)

类似的东西:

numpy_arrays = [A, B, C]

result = [max(elem) for elem in zip(*numpy_arrays)]