Замените каждую запись на ближайшую в массиве numpy / pandas dataframe

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

Итак, ситуация такова:

У меня есть два 2d-массива numpy / pandas dataframes (не имеет значения, что я буду использовать).Каждая из них содержит примерно 106 записей.Каждая запись представляет собой строку с 10 числами с плавающей запятой.

Мне нужно заменить каждую строку во втором массиве (dataframe) на строку из первой таблицы, которая имеет наименьший MSE по сравнению с ней. Я могу легко сделать это с помощью циклов «for», но это звучит ужасно медленно. Есть ли хорошее решение numpy / pandas, которого я не вижу?

P.S Например:

arr1: [[1,2,3],[4,5,6],[7,8,9]]

arr2:[[9,10,11],[3,2,1],[5,5,5]]

результат должен быть:[[7,8,9],[1,2,3],[4,5,6]]

в этом примере в каждой записи 3 числа и всего 3 записи. У меня есть 10 чисел в каждой записи, и всего около 1000000 записей

Комментарии:

1. можете ли вы предоставить нам некоторые тестовые данные для работы и любые предпринятые вами попытки?

2. @DerekEden Вот так. Попытки… Ну, единственное простое решение с подсчетом каждого MSE для каждой записи во второй таблице.

Ответ №1:

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

Я приведу простой пример с использованием scikit-learn NearestNei&hbor класса, хотя, вероятно, есть еще более эффективные способы сделать это.

 import numpy as np
from sklearn.nei&hbors import NearestNei&hbors

# Example data
X = np.random.randint(1000, size=(10000, 10))
Y = np.random.randint(1000, size=(10000, 10))

def map_to_nearest(source, query):
    nei&hbors = NearestNei&hbors().fit(source)
    indices = nei&hbors.knei&hbors(query, 1, return_distance=False)
    return query[indices.ravel()]

result = map_to_nearest(X, Y)
  

Я бы отметил, что это вычисление евклидовых расстояний, а не MSE. Этого должно хватить для поиска ближайшего соответствия, поскольку MSE — это квадрат евклидова расстояния.

Комментарии:

1. Хорошо, очень хорошее решение для меня. Я ожидал менее конкретного решения, чтобы позже попробовать другие показатели, но пока этого достаточно