高效移动2D numpy子阵列

2024-04-25 08:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表示灰度图像的numpy数组,例如

image = numpy.array([
    [.0, .0, .0, .0, .1, .3, .5, .0],
    [.0, .0, .0, .0, .4, .4, .6, .0],
    [.0, .0, .0, .0, .3, .3, .7, .0],
    [.0, .0, .0, .0, .0, .0, .0, .0],
    [.0, .0, .0, .0, .0, .0, .0, .0],
    [.0, .0, .0, .0, .0, .0, .0, .0],
])

我想把一个子数组移到一个新的位置,用一些常量(比如0.0)填充留下的值。例如,将3x3子数组从(1,5)的中心位置移动到(3,3)的中心位置将导致:

numpy.array([
    [.0, .0, .0, .0, .0, .0, .0, .0],
    [.0, .0, .0, .0, .0, .0, .0, .0],
    [.0, .0, .1, .3, .5, .0, .0, .0],
    [.0, .0, .4, .4, .6, .0, .0, .0],
    [.0, .0, .3, .3, .7, .0, .0, .0],
    [.0, .0, .0, .0, .0, .0, .0, .0],
])

有没有一个有效的方法来执行这样的动作?你知道吗


Tags: 方法图像imagenumpy数组中心array灰度
2条回答

这里有一种使用自定义函数的方法。“中心”的概念仅定义为奇数长度的整数坐标,例如(3 x 3);我的答案也仅限于方块。你知道吗

def mover(A, c_in, c_out, size):
    side = int((size - 1) / 2)
    arr = A[c_in[0]-side: c_in[0]+side+1, c_in[1]-side: c_in[1]+side+1]
    res = np.zeros(shape=A.shape)
    res[c_out[0]-side: c_out[0]+side+1, c_out[1]-side: c_out[1]+side+1] = arr
    return res

centre_in = (1, 5)
centre_out = (3, 3)
size = 3

res = mover(image, centre_in, centre_out, size)

array([[ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0.1,  0.3,  0.5,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0.4,  0.4,  0.6,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0.3,  0.3,  0.7,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ]])

由于您知道要从何处移动到何处的起始索引,我们可以使用np.zeros_like和numpy索引:

h = w = 3
sub = image[0:0+w,4:4+h]
out = np.zeros_like(image)

然后分配:

out[2:2+w, 2:2+h] = sub

输出:

array([[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
       [0. , 0. , 0.1, 0.3, 0.5, 0. , 0. , 0. ],
       [0. , 0. , 0.4, 0.4, 0.6, 0. , 0. , 0. ],
       [0. , 0. , 0.3, 0.3, 0.7, 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ]])

相关问题 更多 >