python插值需要很长时间

python插值需要很长时间,python,scipy,Python,Scipy,我使用1000 x 1000网格中的scipy.interpolate.griddata进行插值。 当我有一个1000(x,y,z)值的点云时,计算只需要几秒钟。 但现在我有1000000个值。所以我创建了一个循环,从这1000000个值中提取1000个值,如下所示: p = [...] z = [...] #p and z are my lists with 1,000,000 values p_new = [] z_new = [] for i in range(1000000):

我使用1000 x 1000网格中的scipy.interpolate.griddata进行插值。 当我有一个1000(x,y,z)值的点云时,计算只需要几秒钟。 但现在我有1000000个值。所以我创建了一个循环,从这1000000个值中提取1000个值,如下所示:

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个值,从1000000个值中提取1000个值),我的值的数量相同,但为什么要花费这么长的时间来计算呢?在我的输出
循环完成
中,我可以看到循环只需要大约10秒,因此它应该与我的循环无关=/

我看不到这里发生了任何异常情况-就我所能说出的时间而言 插值大致与点中的元素数成比例 云

以下是一些测试数据:

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值,这可能表明您还有其他问题,例如内存不足和交换失败。

是否需要立方插值?使用
method='linear'
可以节省时间,前提是不需要多少cubic。你说得对,
method='linear'
只需要几秒钟,但立方插值对我来说会更好……你的条件是随机的,还是你会对它们进行排序?这可能真的很相关。您的数据以前是结构化的/常规的吗?也许现在您已经在这里和那里进行了采样,在较大的间隔之间进行插值需要更多的时间。@atomic:my condition搜索某个z值(+/-一点偏移量):
如果z[i]h-偏移量:
@Big Al:数据是完全随机的。但是在第一次测试中,有1000个值没有这个循环,我的数据也是随机的。