假设我有一个像这样的 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/