【问题标题】:Improving computational speed during interpolation提高插值期间的计算速度
【发布时间】:2018-10-21 23:46:58
【问题描述】:

问题

代码通过应用克里金法执行地统计插值。对于小数据量,它工作得很好。但是,当数据量很大时,计算时间会急剧增加。

常量

c1, c2, c3, c4 是常量

matrx 是大小为 6000 x 6000 的数据集

变量

data 是一个 6000 x 3 数组

gdata 是一个 10000 x 2 数组

代码

我遇到问题的代码摘录如下:

prediction = []
for i, dummy_val in range(10000):
    semivariance = []
    for j in range(len(data[:, 2])):
        distance = np.sqrt((gdata[i, 0]-data[j, 0])**2 + (gdata[i, 1]-data[j, 1])**2)
        semivariance.append((c1 + c2*(1-np.exp(-(distance/c3)**c4))))
    semivariance.append(1)
    iweights = np.linalg.lstsq(matrx, semivariance, rcond=None)
    weights = iweights[:-3][0][:-1]
    prediction.append(np.sum(data[:, 2]*weights))

当我调试代码时,我意识到问题来自于

iweights = np.linalg.lstsq(matrx, semivariance, rcond=None)

对于我正在使用的大型 matrxsemivariance 数组,它的运行速度非常慢。

有没有一种 Python 方法可以帮助提高计算速度,或者我可以重写整个代码块来提高速度?

【问题讨论】:

  • 这看起来像 stackoverflow.com/questions/50288513/… 的副本
  • @WarrenWeckesser 有些事情看起来很相似(比如变量名)。然而,这个问题的上下文是不同的,因为克里金法暗示了相关重复预测的可能性,一个导致不同可能性的上下文(例如,梯度下降的热启动)。
  • @AmiTavory,给定变量名称,两者看起来都像是关于克里金的问题。
  • 如果matrx 对所有i 确实相同,您可以例如在循环外计算它的 QR 分解,然后用它更快地解决最小二乘问题。

标签: python performance pandas numpy scipy


【解决方案1】:

你在用MKL library binding 来numpy 吗?如果没有,您可以尝试一下,看看它是否会影响您的代码的性能。

同样对于predictionsemivariance 列表,您正在为它们创建空列表,然后在每次迭代时为它们附加一个值。根据我的理解,迭代次数在您的代码中是固定的,那么如果您从一开始就创建完整大小的列表以避免在每次追加时动态创建新列表,代码会更快吗?我不知道解释器是否足够聪明,可以检测到列表的大小是固定的以创建它并避免在没有您帮助的情况下重新分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2021-12-14
    • 2021-04-06
    相关资源
    最近更新 更多