python - 使用 NumPy 计算数字 "around"的总和

标签 python numpy vectorization

假设我有一个像这样的 NumPy 数组:

[[100. 100. 100. 100. 100.]
 [100.   0.   0.   0. 100.]
 [100.   0.   0.   0. 100.]
 [100.   0.   0.   0. 100.]
 [100. 100. 100. 100. 100.]]

我想取中间值:

0.   0.   0.
0.   0.   0. 
0.   0.   0.

并将它们设置为等于相应数字上方、左侧、右侧和下方数字的总和。例如,第一个 0. 将变为 100。 + 100. + 0. + 0. = 200..

我通常对矢量化不太熟悉,所以我不确定如何仅使用矢量化来完成此操作。有什么建议吗?

最佳答案

您正在寻找的运算似乎是卷积运算。虽然 numpy 不提供简单的 2d 卷积运算,但 scipy 提供,并且您可以使用它:reference here

对于您的特定情况,您需要使用以下形式的卷积滤波器对 2D 数组进行卷积:

0 1 0
1 0 1
0 1 0

所以代码将是:

from scipy.signal import convolve2d

your_array = np.array([
    [100, 100, 100, 100, 100,],
    [100,   0,   0,   0, 100,],
    [100,   0,   0,   0, 100,],
    [100,   0,   0,   0, 100,],
    [100, 100, 100, 100, 100,],
])

convolution_filter = np.array([
    [0, 1, 0],
    [1, 0, 1],
    [0, 1, 0],
])

output = convolve2d(your_array, convolution_filter, mode="valid")

请注意,还有其他位置参数决定在边缘做什么。为此,请参阅上面的链接。 mode="valid" 忽略未找到相应求和点的点等等。

关于python - 使用 NumPy 计算数字 "around"的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75893723/

相关文章:

python - 重用游标与创建新游标的权衡是什么?

python - 与 Numpy 相比优化 Cython 循环

python - 取三个集合的共同元素

matlab - 按行的交叉索引

python - Numpy 中两个相关数组的矢量化操作

python - Heroku - 没有网络进程在运行

python - Pandas 绘制两列,系列由第三列中的值定义

python - '导入错误: DLL load failed' when fetching MNIST original via sklearn

python - 将 2D 元素的大列表转换为 3D NumPy 数组 - 内存问题

Python 从一组值中屏蔽图像像素