#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. Хорошо, очень хорошее решение для меня. Я ожидал менее конкретного решения, чтобы позже попробовать другие показатели, но пока этого достаточно