Векторизовать этот вызов для minimal_scalar - PullRequest
0 голосов
/ 23 января 2020

У меня есть pandas DataFrame, df, значений точек в форме

     | X | Y |
     |-------|
     |x0 | y0|
df = |x1 | y1|
     |x2 | y2|
        ...
     |xn | yn|

У меня также есть объект scipy.interpolate.Bspline, bs, от scipy. Я хочу, чтобы для каждой точки (xi, yi) в df было найдено минимальное расстояние между (xi, yi) и bs.

В данный момент Я запускаю для l oop, который делает что-то вроде следующего:

class DistanceFunctor:
    def __init__(self, point, spline):
        self.point = point
        self.spline = spline

    def __call__(self, t):
        return distance_between_points(self.point, self.spline(t))


result = []
for xy in df.iterrows():
    result.append(minimize_scalar(DistanceFunctor(xy, bs)).fun)

, где distance_between_points - это просто формула обычного расстояния от математики. Другими словами, я беру точку, создаю DistanceFunctor с точкой и сплайном, затем запускаю функцию minimize_scalar для DistanceFunctor. Я делаю это для каждой точки. Результаты верны, но это очень медленно, чтобы сделать это для каждой точки в моем фрейме данных.

Мне было интересно, есть ли какой-нибудь способ векторизации этой операции, так как сплайн постоянен , Единственное, что меняется каждый раз в течение для l oop, это то, какой пункт я использую.

Спасибо за вашу помощь, и если есть какая-либо дополнительная информация, которую я могу предоставить, пожалуйста, не стесняйтесь спрашивать .

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

1 Ответ

0 голосов
/ 23 января 2020

Тот факт, что вы строите объект для каждой пары точек, которые вы хотите оценить, наверняка замедлит процесс. Вы могли бы избежать использования промежуточного представления и использовать вместо этого понимание списка.

result = [minimize_scalar(distance_between_points(xy, bs)) for xy in df.iterrows()]

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