使用NumPy“围绕”一个数字的数字之和

kt06eoxx  于 2023-04-06  发布在  其他
关注(0)|答案(3)|浏览(119)

假设我有一个这样的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.
我一般是矢量化的新手,所以我不确定如何进行只使用矢量化。有什么提示吗?

mbzjlibv

mbzjlibv1#

你正在寻找的操作似乎是一个卷积操作。虽然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"忽略未找到相应求和点的点,依此类推。

5n0oy7gb

5n0oy7gb2#

我看到这篇文章时,你刚刚发布,然后Numpy没有提到(修改是后来完成的),我制定了它,因此在pytorch中分享,但我相信这将比numpy更快

from torch import nn
import torch
import numpy as np
import torch
import torch.nn.functional as F

input = torch.tensor([[[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.]]])

weights = torch.tensor([[[[0.,1.,0.],
                          [1.,0.,1.],
                          [0.,1.,0.]]]])

output = F.conv2d(input, weights, padding = 0)

print(output)

tensor([[[200., 100., 200.],
     [100.,   0., 100.],
     [200., 100., 200.]]])
lnxxn5zx

lnxxn5zx3#

一些切片:

import numpy as np

a = 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,],
])

lo, mid, hi = slice(-2), slice(1, -1), slice(2, None)

a[mid,mid] = a[lo,mid] + a[hi,mid] + a[mid,lo] + a[mid,hi]

print(a)

相关问题