有效地将坐标设置为 numpy(位图)数组,不包括屏幕外坐标

Efficiently plot coordinate set to numpy (bitmap) array excluding offscreen coordinates

这个问题来自

给出了从 x、y、颜色列表绘制到位图的解决方案:

bitmap = np.zeros((10, 10, 3))

s_x = (0,1,2) ## tuple
s_y = (1,2,3) ## tuple
pixal_val = np.array([[0,0,1],[1,0,0],[0,1,0]]) ## np

bitmap[s_x, s_y] = pixal_val

plt.imshow(bitmap)

但是如何处理某些 (x,y) 对位于位图之外的情况?

效率至上。

如果我可以将屏幕外坐标映射到位图 (-42, 7) -> (0, 7)(15, -6) -> (15, 0) 的第一个 row/col,我可以简单地用 bitmap[:,0,:] = 0; bitmap[0,:,:] = 0 涂黑第一行和列。

这可行吗?

有没有更聪明的方法?

你期待画面外坐标吗?如果是,请不要担心,否则我只是想知道它是否使用了非传统坐标系 - 无论出于何种原因,零可能位于图像的中心

无论如何,在我发现你可以使用 numpy 数组来存储坐标之后,将异常值映射到第一个 row/col 非常简单,只需使用:s_x[s_x < 0] = 0,然而,我相信最使用逻辑查找要使用的像素索引的有效方法,因此只分配它们 - 见下文:

bitmap = np.zeros((15, 16, 3))

## generate data 
s_x = np.array([a for a in range(-3,22)], dtype=int)
s_y = np.array([a for a in range(-4,21)], dtype=int)

np.random.shuffle(s_x)
np.random.shuffle(s_y)

print(s_x)
print(s_y)

pixel_val = np.random.rand(25,3)
## generate is done 

use = np.logical_and(np.logical_and(s_x >= 0, s_x < bitmap.shape[1]), np.logical_and(s_y >= 0, s_y < bitmap.shape[0]))

bitmap[s_y[use], s_x[use]] = pixel_val[use]
    
plt.imshow(bitmap)

输出:

坐标:

[ 8  3 21  9 -2 -3  5 14 -1 18 13 16  0 11  7  1  2 12 15  6 19 10  4 17 20]
[ 8 14  1  9  2  4  7 15  3 -3 19 16  6 -1  0 17  5 13 -2 20 -4 11 10 12 18]

图片:

我 运行 一个测试,它必须分配 3145728(是你在另一个问题中给出的位图大小的四倍),其中大约一半在图像之外,平均花费大约 140 毫秒,而重新映射异常值然后将第一个 row/col 设置为零花费了 200 毫秒用于同一任务