我正在写一个程序,它可以直观地显示温度。在一个网格中有200个数据点,我用插值来填充这些点之间的像素。在
我编写了一个程序,使用反距离加权(在本例中是修改的Shepards方法)输出我想要的数据,给出如下所示的图像:
删除所有不相关的内容(例如图像库的内容),创建该文件的代码如下所示:
首先计算从每个点到每个管的所有距离和总距离(因为这些是不变的)。在这一点上,我并不特别担心所花费的时间,因为它只完成一次,但是我包含了代码,这样您就可以看到值是如何存储的。在
#set_tubes creates an array of tubes (which is the data I'm working on)
#each tube has an x position in pixels, a y position in pixels and a temperature
self.set_tubes()
self.dists = []
for x in range(1,BASE_WIDTH-1):
self.summed_dists.append([])
self.dists.append([])
for y in range(1,BASE_HEIGHT-1):
self.summed_dists[x-1].append([])
self.dists[x-1].append([])
self.summed_dists[x-1][y-1]=0
for row in range(10):
self.dists[x-1][y-1].append([])
for tube in range(20):
dist = np.sqrt((x-self.tubes[row][tube].xPos)**2+(y-self.tubes[row][tube].yPos)**2)+0.1
#The -3 in the next two lines is simply a weighting factor
self.dists[x-1][y-1][row].append(dist**(-3))
self.summed_dists[x-1][y-1] = self.summed_dists[x-1][y-1] + dist**(-3)
然后进行插值(随着温度的变化重复进行)。这是时间的关键。在
^{pr2}$我的问题是速度,对于200*200像素的图像,在我的计算机上运行代码的第二部分大约需要30秒。有没有一种更快的方法来获得相同或相似的效果,或者在我的代码中存在某种明显的低效率?在
我尝试过双线性和双三次插值,但对我得到的图像不是特别满意。在
我还限制了影响单个像素的数据点的邻域,试图加快它的速度,这确实有帮助,但我认为我已经尽我所能,在图像中不产生明显的线条。在
谢谢你的帮助。在
有一个变化可能是一种改进:
尝试将
dists[x][y]
和tubes[row]
移出最内层的循环。 这个可能会在每次内部迭代(it 取决于Python解释器有多聪明):如果Python解释器足够聪明,知道值没有 改变了,这只是更难阅读。但是如果Python解释器 一次又一次地重新计算所有这些数组索引,它可以累加起来。在
我以前有一段话是关于预先设置数组的大小,而不是用} is an O(1) amortized operation 这意味着这里几乎没有可用的优化。如果你对我写的东西感兴趣,可以看看编辑历史。
.append()
来增加数组的大小。gnibbler says ^{相关问题 更多 >
编程相关推荐