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

有效地将坐标设置为numpy(位图)数组,不包括屏幕外坐标,numpy,bitmap,coordinates,vectorization,Numpy,Bitmap,Coordinates,Vectorization,这个问题源自 给出了从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)对位于位图之外的情况 效率是最重要的 如果我可

这个问题源自

给出了从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)
,我就可以用
位图[:,0,:]=0将第一行和列遮住;位图[0,:,:]=0

这可行吗


有更聪明的方法吗?

你期待屏幕外的合作吗?如果是这样,别担心,否则我只是想知道它是否使用了一个非传统的坐标系——不管什么原因,零可能位于图像的中心

无论如何,在我透露可以使用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)
图片:


我运行了一个测试,它必须分配3145728(是你在另一个问题中给出的位图大小的四倍),其中大约一半在图像之外,平均需要140ms左右,而对于相同的任务,重新映射异常值,然后将第一行/列设置为零需要200ms。您可以仅用
&
运算符替换
逻辑_和
。看起来整洁多了。是的,我后来为了“*”把它全掉了
[ 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]