2016-03-03 87 views
3
选择特定阵列

想象我有这样的事情:迭代和多维数组在Python

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的肯定不允许做什么,我想用这种方式。如果它是二维数组,它会更容易,因为我知道迭代器首先遍历行,所以可以转置为沿列运行,但对于多维(此例中为3D)数组(N,M,P)与N,M,P >> 1,我想知道如何做到这一点。

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

回答

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

它给你同样的输出。

+0

谢谢,你的回答是非常有用的,但我想知道...,想象你有兴趣,在与前面相同的例子中,总结偶数行的值,即0 + 8,1 + 9 ,2 + 10,...,4 + 12,7 + 15(按列求和,但以偶数行求和)。有没有一个通用的方法来做到这一点? – David

+1

@大卫:当然。我编辑了我的答案,并为此添加了解决方案。 – Cleb

+0

谢谢,但我仍然想知道是否有更通用的方法。想象一下,我想添加第一个与最后一个,中间,即0 + 12,1 + 13,...,4 + 8,5 + 9,... 7 + 11。还有可能吗?你需要巧妙的坐标转换吗? – David