3

我正在从 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
4

5 回答 5

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.

于 2012-11-25T21:39:21.173 回答
4

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

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

您将得到一个生成的二维数组,它对应于所有数组 slice 的最后一个维度的总和3dArray[i, k, :]

更新

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

sum_vec = np.sum(np.sum(3dArray, axis=0), axis=0)
于 2012-11-25T21:37:32.833 回答
0

您可以对重构后的数组执行求和,而不是两次应用相同的 sum 函数:

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

以上应该更快,因为您只求和一次。

于 2017-07-21T05:58:53.707 回答
0

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

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

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

于 2020-09-16T19:01:15.300 回答
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

于 2017-11-26T01:39:19.503 回答