首页 > 解决方案 > 有效地将坐标设置为 numpy(位图)数组,不包括屏幕外坐标

问题描述

这个问题来自有效地将 {coordinate+value} 的集合绘制到(numpy 数组)位图

给出了从 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)我可以简单地将第一行和列涂黑bitmap[:,0,:] = 0; bitmap[0,:,:] = 0

这是可行的吗?

有没有更聪明的方法?

标签: numpybitmapcoordinatesvectorization

解决方案


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

无论如何,在我发现您可以使用 numpy 数组来存储坐标之后,将异常值映射到第一行/列非常简单,只需使用: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 毫秒,而重新映射异常值,然后设置同一任务的第一行/列归零需要 200 毫秒


推荐阅读