在3d阵列的飞机上的Numpy总和,返回一个标量

时间:2012-11-25 21:32:47

标签: numpy

我正在从MATLAB过渡到Numpy并感受到一些成长的痛苦。

我有一个3D数组,让我们说它是3x3x3,我想要每个平面的标量和。 在matlab中,我会使用:

sum_vec = sum(3dArray,3);

TIA WBG

编辑:我的matlab代码错了。 Matlab只能在一个暗淡中进行矢量化,因此需要一个循环。所以numpy变得更优雅......很酷。

MATLAB
for i = 1:3
    sum_vec(i) = sum(sum(3dArray(:,:,i));
end

5 个答案:

答案 0 :(得分:7)

你可以做到

sum_vec = np.array([plane.sum() for plane in cube])

或只是

sum_vec = cube.sum(-1).sum(-1)

其中cube是您的3d数组。您可以指定01而不是-1(或2),具体取决于飞机的方向。后一版本也更好,因为它不使用Python循环,这通常有助于在使用numpy时提高性能。

答案 1 :(得分:4)

您应该使用np.sum中的axis关键字。与许多其他numpy函数一样,axis允许您沿特定轴执行操作。例如,如果要沿数组的最后一个维度求和,则可以执行以下操作:

import numpy as np
sum_vec = np.sum(3dArray, axis=-1)

您将获得一个生成的2D数组,该数组对应于所有数组切片3dArray[i, k, :]的最后一维的总和。

<强>更新

我不明白你想要什么。你想要总结两个维度(一个平面)。在这种情况下,你可以做两个总和。例如,对前两个维度进行求和:

sum_vec = np.sum(np.sum(3dArray, axis=0), axis=0)

答案 2 :(得分:0)

您可以在重新整形的数组上执行求和,而不是两次应用相同的和函数:

a = np.random.rand(10, 10, 10) # 3D array
b = a.view()
b.shape = (a.shape[0], -1)
c = np.sum(b, axis=1)

上面应该更快,因为你只需加一次。

答案 3 :(得分:0)

sumvec= np.sum(3DArray, axis=2)

或者这也适用

sumvec=3DArray.sum(2)

记住Python以0开头,因此axis = 2表示第三维。

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.sum.html

答案 4 :(得分:0)

如果要在一个平面上求和(并避免循环,这总是一个好主意),则可以使用np.sum并将两个轴作为元组传递给您的参数。 例如,如果您有一个(nx3x3)数组,则使用

np.sum(a, (1,2))

将给出一个(nx1x1),在一个平面而不是单个轴上求和。