6

I have a simulation that runs over many times. Each time an array is produced and I insert it into a larger array keeping track of all the data. for example

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)

which produces:

[[[  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]]]

Since each array represents a simulation in my program. I would like to average the 2 different arrays contained within record.

basically I would like an array with the same dimensions as array but it would be an average of all the individual runs.

I could obviously just loop over the arrays but there is a lot of data in my actual simulations so I think it would be very costly on time

example out put (obviously it wouldn't be zero):

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]]
3
  • 2
    Are you sure numpy.average(record, axis=0) doesn't do what you want? That has the same dimension as array, and each entry is the average of the corresponding entry from the 10 simulations. Commented Feb 5, 2013 at 20:07
  • 2
    record.mean(axis=0) would also work. Commented Feb 5, 2013 at 20:17
  • @WarrenWeckesser -- I think you should add it as an answer... Commented Feb 5, 2013 at 20:19

3 Answers 3

8

Your record array from the example above is three dimensional, with shape:

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

The first dimension corresponds to the 2 iterations of your experiment. To average them, you need to tell np.average to do its thing along 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 ]])

If you know beforehand how many simulations you are going to run, you are better off skipping the list thing altogether and doing something like this:

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]]
Sign up to request clarification or add additional context in comments.

Comments

1

Basically you can use

record.mean(axis=0)

I am not sure over which axis you want to average, as in your example two axes have dimension 2 (your array has shape (2,10,2)). If you meant to average the last one, just use

record.mean(axis=2)

Comments

0

Why would you think it would be very costly on time? You still have to do the same number of additions. Addition is associative!

Just do:

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

1 Comment

Wont this just give me the average value of each individual array?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.