Сципи интерполирует структурированные 2d данные, но оценивает в неструктурированных точках? - PullRequest
1 голос
/ 10 марта 2019

У меня следующий минимальный код, использующий scipy.interpolate.interp2d для интерполяции данных двумерной сетки.

import numpy as np
from scipy import interpolate
x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
f = interpolate.interp2d(x, y, z, kind='cubic')

Теперь f здесь можно использовать для оценки других точек. Проблема в том, что точки, которые я хочу оценить, являются абсолютно случайными точками, не образующими регулярную сетку.

# Evaluate at point (x_new, y_new), in total 256*256 points
x_new = np.random.random(256*256)
y_new = np.random.random(256*256)
func(x_new, y_new)

Это вызовет ошибку времени выполнения на моем ПК, кажется, что x_new и y_new рассматриваются как сетка сетки, генерируется оценочная матрица 65536x65536, что не является моей целью.

RuntimeError: Cannot produce output of size 65536x65536 (size too large)

Один из способов добиться цели - это оценивать баллы один за другим , используя код:

z_new = np.array([f(i, j) for i, j in zip(x_new, y_new)])

Однако, это медленно !!!

%timeit z_new = np.array([f(i, j) for i, j in zip(x_new, y_new)])

1.26 s ± 46.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Есть ли более быстрый способ оценки случайных точек?

Быстрее здесь я имею ввиду сравнимое со временем ниже:

x_new = np.random.random(256)
y_new = np.random.random(256)

%timeit f(x_new, y_new)

Те же 256 * 256 = 65536 оценок, время для этого на моем ПК:

1.21 ms ± 39.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Он не должен быть сравнимой скоростью с 1,21 мсек, 121 мсек полностью допустим.

...