迭代并从Python中的多维数组中选择一个特定的数组

时间:2016-03-03 10:29:07

标签: python arrays numpy multidimensional-array

想象一下我有这样的事情:

 import numpy as np
 arra = np.arange(16).reshape(2, 2, 4)  

给出了

 array([[[0, 1, 2, 3],  
      [4, 5, 6, 7]],  
      [[8, 9, 10, 11],  
      [12, 13, 14, 15]]])     

我想创建一个沿着特定子数组运行的循环(在这种情况下,我想沿着每个'矩阵'的每个'列'运行)并对结果求和(即选择0和4并对它们求和(4),选择1和5并将它们相加(6),...,选择3和7并将它们相加(10),选择8和12并将它们相加(20),...,选择11和15以及将它们相加(26))。

我原本以为用那种看似自然的方式做到了这一点:

 for i in arra[i, j, k]:  
     for j in arra[i, j, k]:  
         for k in arra[i, j, k]:  
             sum...  

问题是Python肯定不允许以这种方式做我想做的事情。如果它是一个2D数组,我会更容易,因为我知道迭代器首先遍历行,所以你可以转置为沿着列运行,但是对于多维(在这种情况下是3D)数组(N,M,P) N,M,P>> 1,我想知道如何做到这一点。

编辑:此问题有一个延续:Choosing and iterating specific sub-arrays in multidimensional arrays in Python

1 个答案:

答案 0 :(得分:1)

您可以使用map完成此操作:

import numpy as np
arra = np.arange(16).reshape(2, 2, 4)  

然后命令:

map(sum, arra)

为您提供所需的输出:

[array([ 4,  6,  8, 10]), array([20, 22, 24, 26])]

或者,您也可以使用list comprehension

res = [sum(ai) for ai in arra]

然后res看起来像这样:

[array([ 4,  6,  8, 10]), array([20, 22, 24, 26])]

修改

如果你想添加相同的行 - 正如你在下面的评论中提到的这个答案 - 你可以(使用zip):

map(sum, zip(*arra))

为您提供所需的输出:

[array([ 8, 10, 12, 14]), array([16, 18, 20, 22])]

为了完整起见,列表理解:

[sum(ai) for ai in zip(*arra)]

为您提供相同的输出。