我正在从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
答案 0 :(得分:7)
你可以做到
sum_vec = np.array([plane.sum() for plane in cube])
或只是
sum_vec = cube.sum(-1).sum(-1)
其中cube
是您的3d数组。您可以指定0
或1
而不是-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),在一个平面而不是单个轴上求和。