python - 如何通过使用 n 个元素的总和来减少 numpy 数组的维度?

标签 python arrays numpy

这个问题在这里已经有了答案:





How to evaluate the sum of values within array blocks

(3 个回答)



2d convolution using python and numpy

(8 个回答)


1年前关闭。




我有以下数组(数字是用于说明的占位符):

arr = np.array([[1,  1,  1,    2,  2,  2,    3,  3,  3,    4  ,4,  4 ],
                [1,  1,  1,    2,  2,  2,    3,  3,  3,    4,  4,  4 ],
                [1,  1,  1,    2,  2,  2,    3,  3,  3,    4,  4,  4 ],

                [5,  5,  5,    6,  6,  6,    7,  7,  7,    8,  8,  8 ],
                [5,  5,  5,    6,  6,  6,    7,  7,  7,    8,  8,  8 ],
                [5,  5,  5,    6,  6,  6,    7,  7,  7,    8,  8,  8 ],

                [9,  9,  9,    10, 10, 10,   11, 11, 11,   12, 12, 12],
                [9,  9,  9,    10, 10, 10,   11, 11, 11,   12, 12, 12],
                [9,  9,  9,    10, 10, 10,   11, 11, 11,   12, 12, 12],

                [13, 13, 13,   14, 14, 14,   15, 15, 15,   16, 16, 16],
                [13, 13, 13,   14, 14, 14,   15, 15, 15,   16, 16, 16],
                [13, 13, 13,   14, 14, 14,   15, 15, 15,   16, 16, 16]])
我想以这样一种方式减小尺寸,即每 9 个具有相同数字的元素(3x3 区域)都会被汇总。所以 12*12 的数组应该变成 4x4 的数组。
我在这里寻找其他答案,并为我适应的一维数组找到了一些东西。
但是,它没有按预期工作:
result = np.sum(arr.reshape(-1,3), axis=1)
result = np.sum(result .reshape(3,-1), axis=0)
实现预期结果的正确方法是什么?

最佳答案

我建议关注 Nils' answer ,因为对于这种特殊情况,它更简单,更有效,尽管我在下面的建议更笼统,如果你想要的不仅仅是一个总和。

您正在寻找convolution .一个小内核在数组上运行,执行逐元素乘法并对结果求和,在每一步为新数组生成值。在这种情况下,我们需要一个简单的总和,因此我们将使用具有适当大小 (3x3) 的内核。因为我们不希望重叠,所以我们的步幅在两个方向上也是 3。
2D 卷积在 NumPy 中不可用,因此我们必须从 SciPy 导入。但是该函数没有跨步(跳过)功能,因此我们将手动实现我们自己的。

from scipy.signal import convolve2d

kernel = np.ones((3, 3))
convolved = convolve2d(arr, kernel, mode='valid')
strided = convolved[::3, ::3]
strided这里包含结果,我们可以通过除以9来检查最终结果,得到每个单元格的原始值。
>>> strided / 9
array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.],
       [ 9., 10., 11., 12.],
       [13., 14., 15., 16.]])

关于python - 如何通过使用 n 个元素的总和来减少 numpy 数组的维度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64662743/

相关文章:

python - 在 python 中通过另外两个修改的数组

python - 尝试连接时出现 SMTP python 跟踪错误

python - 如何将 12 位 DICOM 图像转换为 8 位 jpeg?

python - Django limit_choices_to on OneToOneField 与上游外键字段

java - 获取和设置方法不更改数组

arrays - 如何将数组划分为 K 个子数组,以使所有子数组中重复元素的数量之和最小?

java - 将 numpy 数组转换为 Android/Java 可读格式?

python - Kevin Bacon 游戏的最短路径图遍历

Java:获取用于反射的原始数组类的正确方法

python - N点与numpy/scipy中的引用之间的有效距离计算