2013-02-05 15 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)