Python 2D数组和枚举

时间:2017-02-09 06:33:05

标签: python python-2.7 numpy for-loop multidimensional-array

我正在尝试遍历2D数组,获取数组中每个列表的总和。例如,我有:

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

我想取每个较小数组的值,例如5 + 3 + 6和2 + 1 + 3并将它们放入一个新数组中。所以我的目标是:

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

我无法正确枚举2D数组。它似乎跳了起来。我知道我的代码不正确,但这是我到目前为止所做的:

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)

2 个答案:

答案 0 :(得分:3)

你可以用pythonic方式做到这一点,

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

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

答案 1 :(得分:2)

由于你正在使用Numpy,你应该让Numpy处理循环:它比使用显式Python循环更有效

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)

典型输出

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

至于您发布的代码,它有一些问题。主要的是您需要为每个子列表将sum变量设置为零。顺便说一句,你不应该使用sum作为变量名,因为这会影响Python的内置sum函数。

此外,您的阵列访问错误。 (并且您不应该使用array作为变量名,因为它是标准模块的名称。)

for array in test:
    for i in array:

遍历test中的每个列表,然后遍历每个列表中的每个项目,因此i已经是内部列表的项目,因此在

sum += test[array][i]

您试图使用列表而不是整数来索引test列表,然后您尝试使用i中的当前项索引该结果。

(换句话说,在Python中,当你在for循环中迭代一个容器对象时,循环变量会接受容器中项目的值,而不是它们的索引。如果你这可能会让人感到困惑来自循环变量获取这些项的索引的语言。如果你想要索引,你可以使用内置的enumerate函数来同时获取索引和项目。

这是修复后的代码版本。

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)

典型输出

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

正如我之前所说,使用Numpy数组并让Numpy为你做循环会好得多。但是,如果您的程序只处理小型列表,则无需使用Numpy:只需使用标准random模块中的函数生成随机数,并使用Rahul KP的答案中显示的技术来计算总和:它比使用Python循环更紧凑,更快。