我在1000 x 1000网格中使用scipy.interpolate.griddata进行插值。 当我有一个具有1,000(x,y,z)值的点云时,计算只需要几秒钟。 但现在我有1,000,000个值。所以我创建了一个循环来从这1,000,000个值中提取1,000个值,如下所示:
p = [...]
z = [...]
#p and z are my lists with 1,000,000 values
p_new = []
z_new = []
for i in range(1000000):
if condition:
#condition is True for about 1000 times
p_new.append(p[i])
z_new.append(z[i])
print 'loop finished'
points = np.array(p_new)
values = np.array(z_new)
grid_z1 = griddata(points, values, (grid_x, grid_y), method='cubic')
plt.imshow(grid_z1.T, origin='lower')
plt.show()
print len(p_new)
返回1000
,因此我的循环按预期工作。
但是在我的循环结束后,我在等待15分钟后取消了我的程序,因为没有发生任何事情。
所以最后我的问题是:
为什么这个计算需要这么长,尽管在两种情况下(默认为1000个值,1000个值从1000000中提取出来)我有相同数量的值?在我的输出loop finished
中我可以看到循环只需要大约10秒,所以它应该与我的循环无关= /
答案 0 :(得分:1)
我看不到任何不寻常的事情 - 就我所知的时间而言 内插大致与该点中的元素数量成比例 云。
以下是一些测试数据:
def fake_data(n):
# xy coordinates for an n-by-n grid
grid = np.indices((n,n),dtype=np.float32).reshape(2,-1).T
# interpolated coordinates
xy_i = grid.copy()
# not monotonically increasing
np.random.shuffle(xy_i)
# values
z = np.random.rand(n**2)
# input coordinates
xy = grid.copy()
# not regularly gridded
xy += np.random.rand(*xy_i.shape)*0.25
# pick n random points to use
inc = np.random.choice(np.arange(n**2),(n,),replace=False)
xy = grid[inc,:]
z = z[inc]
return xy, z, xy_i
对于所有三种方法, N 对时间的对数 - 对数图大致是一条直线, 斜率为~2,即它们都需要 O(N ^ 2)时间。
如果在您的情况下,您看到线条不直,但向上偏离 对于 N 的大值,这可能表示您遇到了其他问题,例如内存不足和按下交换。