3

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

4 回答 4

8

使用numpy.maximum

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

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

于 2012-04-12T18:30:28.760 回答
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]]
>>> 
于 2012-04-12T18:55:09.527 回答
4

如果您需要比较超过 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 堆栈

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

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

于 2014-04-03T19:29:35.247 回答
0

就像是:

numpy_arrays = [A, B, C]

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

?

于 2012-04-12T18:31:21.847 回答