找到两个数组PLOT1和PLOT2之间的最小距离,并将索引存储在该点

时间:2018-06-12 14:00:40

标签: python arrays numpy

有2个数组Plot1的格式为plot1 = [1.0, 2.0, 3.0] (1X4),我们有tp找到plot1与plot2的最小距离,(plot2中有多个数组存储在其中)。我们希望O / P为             i)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 :(得分:0)

你可以做什么,我编辑我的答案,以便回答你的问题:

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)

答案 1 :(得分:0)

你使用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的内容相匹配,表示每行中包含最小值的列。