Как получить доступ к указанному элементу c в наиболее похожем ряду с евклидовым расстоянием? - PullRequest
2 голосов
/ 13 марта 2020

У меня есть список L массивов:

L = ( array1,
      array2,
      array3,
      array4... )

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

Использование евклидова расстояния Я хочу:

  1. Итерация по всем массивам
  2. Выбор только массивов, в которых 2-й элемент включается между 10 и 100
  3. Учитывая массив arr1, выберите наиболее похожий (скажем arr4)
  4. Замените 2nd элемент в arr4 с 2-й элемент в arr1

Для визуализации:

  1. Итерация по всем массивам

     L = ([87, 30,  45,  99],
         [11,  21,  31,  41],
         [560, 47,  85,  328],
         [167, 32,  98,  379] )
    
  2. Выберите только массивы, в которых 2-й элемент включен между 10 и 100

    L = ([87,  30,  45,  99],
         [11,  21,  31,  41],
         [560, 47,  85,  328],
         [85,  33,  43,  97] )
    
  3. Для данного массива arr1, выберите наиболее похожий (скажем, arr4)

    array 1 = ( [87, 30,  45,  99] )
    
    array 4 = ( [85, 32,  43,  97] )
    

    Теперь давайте обратимся к простоте:

    P = 30 (массив 1, 2-й элемент)

    X = 32 (массив 4, 2-й элемент)

  4. Заменить элемент 2nd в arr4 (P) внутри arr1 2-я позиция (X)

    array 1 = ([87, 32, 45, 99])
    

Большое спасибо и заранее за любой совет, который может быть полезен!

1 Ответ

0 голосов
/ 14 марта 2020
import numpy as np

L = np.array([
  [87, 30,  45,  99],
  [11,  21,  31,  41],
  [560, 47,  85,  328],
  [167, 32,  98,  379]
])

Для точки 2 вы можете использовать np.where, который возвращает массив condition.nonzero (), который указывает, где условие равно True . Затем вы можете поместить этот массив в качестве индекса.


result = L[np.where((L[:,1]>10)&(L[:,1]<100))]

Для данного массива, например arr1, мы можем использовать следующий метод (я не знаю, лучше ли он, но он работает).

L2 = np.array([
  [87,  30,  45,  99],
  [11,  21,  31,  41],
  [560, 47,  85,  328],
  [85,  33,  43,  97]
])

def dist(a):
  return np.linalg.norm(L2[0]-a)

distances = np.apply_along_axis(dist, 1, L2)
index = np.ma.MaskedArray(result, result==0).argmin() #remove first element which dist is min (0)
print(L2[index])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...