Найти минимальное расстояние между двумя массивами PLOT1 и PLOT2, а также сохранить индекс, где находится эта точка - PullRequest
0 голосов
/ 12 июня 2018

2 массива Plot1 имеют форму plot1 = [1.0, 2.0, 3.0] (1X4), и мы имеем tp найти минимальное расстояние plot1 с plot2, (plot2, в котором хранится несколько массивов). Мы хотим, чтобы O / P как i) минимальное расстояние между всеми точкамиfrom plot2 (Smin) ii) Индекс, в котором хранится точка. iii) Индекс массива, в котором хранится точка. Мой код работает, когда plot2 имеет один массив. Но происходит сбой, когда он имеет несколько массивов как

    plot2 = np.array([[(1.0, 4.0, 5.0),(4.0, 7.0, 90.0),(1.0, 4.0, 5.0)],
     [(2.9,3.2,3.3),(2.3,2.6,5.5),(2.4,3.5,4.4)],
     [(2.9,3.2,3.3),(2.3,2.6,5.5),(2.4,3.5,4.4)]])

Итак, мой рабочий код

import numpy as np


    plot1 = [1.0, 2.0, 3.0]
    plot2 = [(1.0, 4.0, 5.0),
             (4.0, 7.0, 90.0),
             (1.0, 4.0, 5.0),
             (-1.0, -4.0, -5.0)]



    indexes = []
    for i in range(len(plot2)):  # To get one element at a time from plot2
        plotk = plot2[i]
        S = np.linalg.norm(np.array(plot1) - np.array(plotk))
        print("Distance between plot1 and plotk is %f"  %(S))  # euclidian distance is calculated
        if (i == 0):
            Smin = S
            Sminant = S
            indexes.append(i)
        else:
            if (S < Sminant):
                Smin = S
                Sminant=Smin
                indexes = []
                indexes.append(i)
            elif (S == Sminant):
                indexes=[]
                indexes.append(i)

    print('indexes:')
    print(indexes)

    for i in range(len(indexes)):
       print("VAlues of Slist with min  \n",indexes[i], plot2[indexes[i]],Smin)

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы используете import numpy as np, но не используете его ... Давайте посмотрим, что мы можем использовать из огромного арсенала numpy методов (ключ - метод argmin ...)

In [10]: from numpy import abs, argmin, array

In [11]: plot1 = array([1.0, 2.0, 3.0])
    ...: plot2 = array([(1.0, 4.0, 5.0),
    ...:                (4.0, 7.0, 90.0),
    ...:                (1.0, 4.0, 5.0),
    ...:                (-1.0, -4.0, -5.0)])

In [12]: adiff = abs(plot1-plot2)

In [13]: adiff
Out[13]: 
array([[ 0.,  2.,  2.],
       [ 3.,  5., 87.],
       [ 0.,  2.,  2.],
       [ 2.,  6.,  8.]])

In [14]: indices = argmin(adiff, axis=1)

In [15]: indices
Out[15]: array([0, 0, 0, 0])

В конечном итоге можно использовать indices, чтобы получить значения минимумов

In [17]: adiff[range(adiff.shape[0]), indices]
Out[17]: array([0., 3., 0., 2.])

range(adiff.shape[0]) дает номер каждой строки по очереди,соответствует содержимому indices, которое указывает на столбец, который в каждой строке содержит минимум.

0 голосов
/ 12 июня 2018

Что вы можете сделать, я редактирую свой ответ, чтобы он отвечал на ваш вопрос:

row,col,n=plot2.shape

S=np.empty([row,col])
for i_row in range(row):
    for i_col in range(col):
        plotk = plot2[i_row,i_col]
        S[i_row,i_col] = np.linalg.norm(np.array(plot1) - np.array(plotk))

np.min(S)
ind = np.unravel_index(np.argmin(S, axis=None), S.shape)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...