将数据从一个numpy数组复制到另一个可能大小不匹配的数组

x33g5p2x  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(220)

所以我的问题是,我试图用典型的numpy语法将一个小图像粘贴到一个大图像中:

large_im = np.linspace(0,1,20)[:,None]*np.ones([1,20])
small_im = np.linspace(1,0,10)[None,:]*np.ones([10,1])

a0,b0 = 5,5
large_im[a0:a0+small_im.shape[0],b0:b0+small_im.shape[1]] = small_im

plt.figure()
plt.imshow(large_im)

大多数情况下这都很好,但也有一些边缘情况,即小图像的一部分挂在大图像之外,numpy不喜欢这样。
就像这样:

a0,b0 = 15,15
large_im[a0:a0+small_im.shape[0],b0:b0+small_im.shape[1]] = small_im

或者:

a0,b0 = -5,-5
large_im[a0:a0+small_im.shape[0],b0:b0+small_im.shape[1]] = small_im

这两个代码段会引发Value错误,因为numpy索引生成的目标数组与small_im大小不匹配。
现在,我不得不通过编写一堆代码来繁琐地处理所有这些边缘情况,这些代码检查源区域和目标区域的每个维度,并修剪大小,以便一切都合适。

你知道是否有一个numpy函数可以自动完成这个任务吗?

iecba09b

iecba09b1#

这样的东西怎么样:

a0,b0 = 15,15

view = large_im[a0 : a0 + small_im.shape[0], b0 : b0 + small_im.shape[1]]

view[:] = small_im[: view.shape[0], : view.shape[1]]

plt.imshow(large_im)
plt.show()

a0b0为负数时,它不起作用,但您可以轻松地使用if语句来处理这些情况:

if a0 < 0:
    a0 += large_im.shape[0]

if b0 < 0:
    b0 += large_im.shape[1]

相关问题