2011-09-30 947 views

回答

5

使用reduce

reduce(np.maximum, matrices) 

docs

reduce功能迭代 [,初始化])

应用的两个参数函数累积到可迭代的项目,从左到右依次为 ,以便将迭代次数减少为单个值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])计算 ((((1+2)+3)+4)+5)。左边的参数x是累计值, 正确的参数y是可迭代的更新值。如果 可选初始值设定项存在,它将放置在计算中可迭代的项目 之前,并且当可迭代对象 为空时,它将用作默认值。如果初始化程序没有给出并且可迭代只包含一个 项目,则返回第一个项目。

+0

+1这非常棒,比Justin或我的答案快一点,特别是对于大型矩阵。 – JoshAdel

+0

这正是我所期待的!感谢你们。 –

+0

我觉得很奇怪,np.maximum.reduce(矩阵)比这慢。我敢打赌,numpy首先使用np.array转换矩阵。 –

3
import numpy as np 
matrices=[np.random.random((5,5)) for i in range(10)] 
np.max(np.hstack(matrices)) 

会给你所有n个矩阵的最大值。这基本上使用np.hstackmatrices中的所有矩阵合并到一个数组中,然后获取该新数组的最大值。这假定所有的矩阵都有相同的行数。您也可以使用np.vstacknp.concatenate来达到类似的效果。

编辑我重读你的问题,你可能会真正想要的东西更像:

np.max(np.dstack(matrices),axis=2) 

这将栈中所有的矩阵沿第三轴线,然后给你沿着这个方向最大,为你的情况返回一个5x5矩阵。

编辑#2这里有一些计时:

In [33]: matrices = [np.random.random((5,5)) for i in range(10)] 

In [34]: %timeit np.dstack(matrices).max(2) 
10000 loops, best of 3: 92.6 us per loop 

In [35]: %timeit np.array(matrices).max(axis=0) 
10000 loops, best of 3: 90.9 us per loop 

In [36]: %timeit reduce(np.maximum, matrices) 
10000 loops, best of 3: 25.8 us per loop 

和一些较大的阵列:

In [37]: matrices = [np.random.random((200,200)) for i in range(100)] 

In [38]: %timeit np.dstack(matrices).max(2) 
10 loops, best of 3: 111 ms per loop 

In [39]: %timeit np.array(matrices).max(axis=0) 
1 loops, best of 3: 697 ms per loop 

In [40]: %timeit reduce(np.maximum, matrices) 
100 loops, best of 3: 12.7 ms per loop 

史蒂芬获胜!

+0

OP想要一个输出矩阵,其中每个元素是位于输入矩阵中相同位置的所有元素的最大值。 –

+0

修复它之前,我看到您的评论 – JoshAdel

+0

+1的时机。 –