For循环在np 3d数组上获得总和和平均值

For loop to obtain sum and mean on np 3d array

我有以下数组

arr = np.array([[[1, 2, 3], [4, 5, 6]], 
                [[7, 8, 9], [10, 11, 12]]])

我想遍历每个元素并在轴 0 上求和,所以我这样做:

lst = []
for x in arr:
    for y in np.sum(x,axis=0):
        lst.append(y)

现在 lst 在哪里

[5, 7, 9, 17, 19, 21]

但是我希望输出为以下形式:

[[5, 7, 9], [17, 19, 21]]

然后取其轴 0 的平均值,即 (5+17)/2 等等。最终输出应该类似于

[11., 13., 15.]

我想知道我该怎么做?是否可以将整个操作以紧凑的形式编写为列表理解?

更新: 要获得最终输出,我可以这样做:

np.mean(np.reshape(lst, (len(arr),-1)),axis=0) 

但我确信有一种 Pythonic 的方式可以做到这一点

In [5]: arr = np.array([[[1, 2, 3], [4, 5, 6]],
   ...:                 [[7, 8, 9], [10, 11, 12]]])
In [7]: arr
Out[7]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

for 在第一个维度上迭代,就好像它是一个数组列表:

In [8]: for x in arr:print(x)
[[1 2 3]
 [4 5 6]]
[[ 7  8  9]
 [10 11 12]]

list(arr) 也制作一个列表(但它比 `arr.tolist() 慢)。

在其他维度上迭代的一种常见方法是使用索引:

In [10]: for i in range(2):print(arr[:,i])
[[1 2 3]
 [7 8 9]]
[[ 4  5  6]
 [10 11 12]]

您也可以转置将所需轴放在首位的数组。

但你不需要迭代

In [13]: arr.sum(axis=1)
Out[13]: 
array([[ 5,  7,  9],
       [17, 19, 21]])
In [14]: arr.sum(axis=1).mean(axis=0)
Out[14]: array([11., 13., 15.])