Iterate over a matrix, sum over some rows and add the result to another array

Question:

Hi there I have the following matrix

 [[ 47  43  51  81  54  81  52  54  31  46]
  [ 35  21  30  16  37  11  35  30  39  37]
  [  8  17  11   2   5   4  11   9  17  10]
  [  5   9   4   0   1   1   0   3   9   3]
  [  2   7   2   0   0   0   0   1   2   1]
  [215 149 299 199 159 325 179 249 249 199]
  [ 27  49  24   4  21   8  35  15  45  25]
  [100 100 100 100 100 100 100 100 100 100]]

I need to iterate over the matrix summing all elements in rows 0,1,2,3,4 only
example: I need

  row_0_sum = 47+43+51+81....46

Furthermore I need to store each rows sum in an array like this

 [row0_sum, row1_sum, row2_sum, row3_sum, row4_sum]

So far I have tried this code but its not doing the job:

  mu = np.zeros(shape=(1,6))

  #get an average 
  def standardize_ratings(matrix):
 sum = 0
 for i, eli in enumerate(matrix):
     for j, elj in enumerate(eli):
        if(i<5):
         sum = sum + matrix[i][j]
         if(j==elj.len -1):
           mu[i] = sum
           sum = 0
           print "mu[i]="
           print mu[i]

This just gives me an Error: numpy.int32 object has no attribute 'len'

So can someone help me. What’s the best way to do this and which type of array in Python should I use to store this. Im new to Python but have done programming….

Thannks

Asked By: banditKing

||

Answers:

Make your data, matrix, a numpy.ndarray object, instead of a list of lists, and then just do matrix.sum(axis=1).

>>> matrix = np.asarray([[ 47,  43,  51,  81,  54,  81,  52,  54,  31,  46],
  [ 35,  21,  30,  16,  37,  11,  35,  30,  39,  37],
  [  8,  17,  11,   2,   5,   4,  11,   9,  17,  10],
  [  5,   9,   4,   0,   1,   1,   0,   3,   9,   3],
  [  2,   7,   2,   0,   0,   0,   0,   1,   2,   1],
  [215, 149, 299, 199, 159, 325, 179, 249, 249, 199],
  [ 27,  49,  24,   4,  21,   8,  35,  15,  45,  25],
  [100, 100, 100, 100, 100, 100, 100, 100, 100, 100]])

>>> print matrix.sum(axis=1)
[ 540  291   94   35   15 2222  253 1000]

To get the first five rows from the result, you can just do:

>>> row_sums = matrix.sum(axis=1)
>>> rows_0_through_4_sums = row_sums[:5]
>>> print rows_0_through_4_sums
[540 291  94  35  15]

Or, you can alternatively sub-select only those rows to begin with and only apply the summation to them:

>>> rows_0_through_4 = matrix[:5,:]
>>> print rows_0_through_4.sum(axis=1)
[540 291  94  35  15]

Some helpful links will be:

NumPy for Matlab Users, if you are familiar with these things in Matlab/Octave

Slicing/Indexing in NumPy

Answered By: ely
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.