2013-02-05 19 views
2

我有一個運行多次的模擬。每次生成一個數組並將其插入到一個更大的數組中以記錄所有數據。例如如何在python中平均數組數組?

record = [] 
for i in range(2): 
    r = random.random() 
    array = numpy.arange(20)*r 
    array.shape = (10,2) 
    record.append(array) 
record = numpy.array(record) 

其產生:

[[[ 0.   0.88765927] 
    [ 1.77531855 2.66297782] 
    [ 3.55063709 4.43829637] 
    [ 5.32595564 6.21361492] 
    [ 7.10127419 7.98893346] 
    [ 8.87659274 9.76425201] 
    [ 10.65191128 11.53957056] 
    [ 12.42722983 13.3148891 ] 
    [ 14.20254838 15.09020765] 
    [ 15.97786693 16.8655262 ]] 

[[ 0.   0.31394919] 
    [ 0.62789839 0.94184758] 
    [ 1.25579677 1.56974596] 
    [ 1.88369516 2.19764435] 
    [ 2.51159354 2.82554274] 
    [ 3.13949193 3.45344112] 
    [ 3.76739031 4.08133951] 
    [ 4.3952887 4.70923789] 
    [ 5.02318709 5.33713628] 
    [ 5.65108547 5.96503466]]] 

由於每個array表示在我的程序的模擬。我想平均包含在record內的2個不同的陣列。

基本上我想要一個與array一樣大小的數組,但它將是所有單獨運行的平均值。

我可以明明只是循環數組結束,但有大量的數據在我的實際模擬,所以我認爲這將是對時間非常昂貴

例如放出來(當然它不會是零):

average = [[0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0] 
      [0.0, 0.0]] 
+2

你確定'numpy.average(記錄,軸= 0)'沒有做你想要的嗎?這與'array'具有相同的維度,每個條目是來自10次模擬的相應條目的平均值。 –

+1

'record.mean(axis = 0)'也可以。 –

+0

@WarrenWeckesser - 我認爲你應該把它作爲一個答案... – root

回答

0

爲什麼你認爲這將是非常昂貴的時間?你仍然需要做同樣數量的增加。加法是聯想!

只要做到:

averages = [average(subarray) for subarray in bigarray] 
+0

不會這只是給我每個單獨陣列的平均值? – user1696811

3

record從上面的例子陣列是三維的,具有形狀:

>>> record.shape 
(2, 10, 2) 

第一維對應於所述2次迭代實驗的。爲了取它們的平均值,你需要告訴np.average做它的事沿着axis=0

>>> np.average(record, axis=0) 
array([[ 0.  , 0.45688836], 
     [ 0.91377672, 1.37066507], 
     [ 1.82755343, 2.28444179], 
     [ 2.74133015, 3.19821851], 
     [ 3.65510686, 4.11199522], 
     [ 4.56888358, 5.02577194], 
     [ 5.4826603 , 5.93954865], 
     [ 6.39643701, 6.85332537], 
     [ 7.31021373, 7.76710209], 
     [ 8.22399044, 8.6808788 ]]) 

如果你知道你要提前多少模擬運行,你最好不要完全跳過名單的事情,做這樣的事情:

simulations, sim_rows, sim_cols = 1000000, 10, 2 
record = np.empty((simulations, sim_rows, sim_cols)) 
for j in xrange(simulations) : 
    record[j] = np.random.rand(sim_rows, sim_cols) 

>>> np.average(record, axis=0) 
[[ 0.50021935 0.5000554 ] 
[ 0.50019659 0.50009123] 
[ 0.50008591 0.49973058] 
[ 0.49995812 0.49973941] 
[ 0.49998854 0.49989957] 
[ 0.5002542 0.50027464] 
[ 0.49993122 0.49989623] 
[ 0.50024623 0.49981818] 
[ 0.50005848 0.50016798] 
[ 0.49984452 0.49999112]] 
1

基本上你可以使用

record.mean(axis=0) 

我不知道在哪個軸你想平均,如在你的例子中兩個軸的尺寸爲2(你的數組有形狀(2,10,2))。如果你的意思是平均最後一個,只是使用

record.mean(axis=2)