有效地将坐标设置为numpy(位图)数组,不包括屏幕外坐标
这个问题源自 给出了从x、y、颜色列表打印到位图的解决方案:有效地将坐标设置为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)对位于位图之外的情况 效率是最重要的 如果我可
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]