helloworld
helloworld

Reputation: 409

Python 2D array sum enumeration

I'm trying to iterate through a 2D array getting the sum for each list inside the array. For example I have:

test = [[5, 3, 6], [2, 1, 3], [1, 1, 3], [2, 6, 6], [4, 5, 3], [3, 6, 2], [5, 5, 2], [4, 4, 4], [3, 5, 3], [1, 3, 4]]

I want to take the values of each smaller array, so for example 5+3+6 and 2+1+3 and put them into a new array. So I'm aiming for something like:

testSum = [14, 6, 5, 14...]. 

I'm having trouble properly enumerating through a 2D array. It seems to jump around. I know my codes not correct but this is what i have so far:

k = 10
m = 3
testSum = []

#create array with 10 arrays of length 3
test = [[numpy.random.randint(1,7) for i in range(m)] for j in range(k)]
    sum = 0
    #go through each sub-array in test array
    for array in test:
    #add sums of sub-arrays
        for i in array
            sum += test[array][i]
        testSum.append(sum)

Upvotes: 1

Views: 506

Answers (2)

PM 2Ring
PM 2Ring

Reputation: 55469

Since you're using Numpy, you should let Numpy handle the looping: it's much more efficient than using explicit Python loops.

import numpy as np

k = 10
m = 3

test = np.random.randint(1, 7, size=(k, m))
print(test)
print('- ' * 20)

testSum = np.sum(test, axis=1)
print(testSum)

typical output

[[2 5 1]
 [1 5 5]
 [6 5 3]
 [1 1 1]
 [2 5 6]
 [4 2 5]
 [3 3 1]
 [6 4 6]
 [2 5 1]
 [6 5 2]]
- - - - - - - - - - - - - - - - - - - - 
[ 8 11 14  3 13 11  7 16  8 13]

As for the code you posted, it has a few problems. The main one being that you need to set the sum variable to zero for each sub-list. BTW, you shouldn't use sum as a variable name because that shadows Python's built-in sum function.

Also, your array access is wrong. (And you shouldn't use array as a variable name either, since it's the name of a standard module).

for array in test:
    for i in array:

iterates over each list in test and then over each item in each of those list, so i is already an item of an inner list, so in

sum += test[array][i]

you are attempting to index the test list with a list instead of an integer, and then you're trying to index the result of that with the current item in i.

(In other words, in Python, when you iterate over a container object in a for loop the loop variable takes on the values of the items in the container, not their indices. This may be confusing if you are coming from a language where the loop variable gets the indices of those items. If you want the indices you can use the built-in enumerate function to get the indices and items at the same time).

Here's a repaired version of your code.

import numpy as np

k = 10
m = 3

#create array with 10 arrays of length 3
test = [[np.random.randint(1,7) for i in range(m)] for j in range(k)]
print(test)
print()

testSum = []
#go through each sub-array in test array
for array in test:
    #add sums of sub-arrays
    asum = 0
    for i in array:
        asum += i
    testSum.append(asum)

print(testSum)

typical output

[[4, 5, 1], [3, 6, 6], [3, 4, 1], [2, 1, 1], [1, 6, 4], [3, 4, 4], [3, 2, 6], [6, 3, 2], [1, 3, 5], [5, 3, 3]]

[10, 15, 8, 4, 11, 11, 11, 11, 9, 11]

As I said earlier, it's much better to use Numpy arrays and let Numpy do the looping for you. However, if your program is only processing small lists there's no need to use Numpy: just use the functions in the standard random module to generate your random numbers and use the technique shown in Rahul K P's answer to calculate the sums: it's more compact and faster than using a Python loop.

Upvotes: 2

Rahul K P
Rahul K P

Reputation: 16081

You can do this more pythonic way,

In [17]: print [sum(i) for i in test]
[14, 6, 5, 14, 12, 11, 12, 12, 11, 8]

or

In [19]: print map(sum,test)
[14, 6, 5, 14, 12, 11, 12, 12, 11, 8]

Upvotes: 3

Related Questions