2011-09-30 136 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的時機。 –

相關問題