【问题标题】:Python 2D array sum enumerationPython 2D 数组和枚举
【发布时间】:2017-06-27 01:18:47
【问题描述】:

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

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

我无法正确枚举二维数组。它似乎跳来跳去。我知道我的代码不正确,但这是我目前所拥有的:

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)

【问题讨论】:

  • 也许 - list(map(sum, test))

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


【解决方案1】:

你可以用更 Python 的方式来做这个,

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]

【讨论】:

    【解决方案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 循环更紧凑、更快速。

    【讨论】:

    • 非常感谢您的澄清!我不知道 sum 是 python 的内置函数。来自 Java,python 中的索引对我来说有点令人困惑,但你已经让它更清楚了。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多