Улучшение скорости вычислений во время интерполяции - PullRequest
0 голосов
/ 11 мая 2018

Задача

Код выполняет геостатистическую интерполяцию с применением кригинга.Для небольшого размера данных это прекрасно работает.Однако когда данные большие, время вычислений резко увеличивается.

Константы

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)

, который работает очень медленно для большого массива matrx и semivariance, который я использую.

Есть ли питонский способ помочь улучшить скорость вычислений или способ, которым я мог бы переписать весь блок кода для повышения скорости?

1 Ответ

0 голосов
/ 12 мая 2018

Используете ли вы библиотеку MKL для numpy? Если нет, вы можете попробовать и проверить, не влияет ли это на производительность вашего кода.

Также для списков prediction и semivariance вы создаете пустые списки для них обоих, а затем добавляете значение для них на каждой итерации. Насколько я понимаю, количество итераций в вашем коде фиксировано, поэтому будет ли код быстрее, если вы с самого начала создавали списки в полном размере, чтобы избежать динамического создания нового списка с каждым добавлением? Я не знаю, достаточно ли умен интерпретатор, чтобы определить фиксированный размер списка, чтобы создать его и избежать перераспределения с вашей помощью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...