如何排序向量以使其与另一个向量的距离最小?

时间:2019-01-14 14:26:57

标签: python numpy

我有两个向量(v1,v2)。向量v2中的值需要排序,以便可以使用v1中的元素标识每个值。 v1和v2中的值略有不同,但可以切换。最后,我需要进行多次修改,因为我需要根据已排序的v2对下一个v3进行排序,依此类推。

我考虑过要针对v2中值的每种可能顺序查看v2的不同排列。与v1的差异的最小总和应该是我想要的排序。从原理上讲,这是可行的,但是当v1和v2变大时,缩放比例确实很糟糕。

此代码显示了一对v1,v2的顺序。

import numpy as np
import itertools

def sort(v1,v2):

    arr_permutations = np.array(list(itertools.permutations(v2)))

    sum_diff = np.sum(np.abs(arr_permutations - v1), axis=1)

    best_permut = arr_permutations[np.argmin(sum_diff)]

    return best_permut 

v1 = np.array([-0.99418 -0.106364j, -1.005974-0.099054j,
 -0.991923-0.107482j, -0.990868-0.107976j, -0.990558-0.108118j,
 -0.898555+0.035351j])

v2 = np.array([-1.0052  -0.10133j,  -0.993598-0.108516j,
  0.991379-0.109617j, -0.990341-0.110104j, -0.990036-0.110244j, 
 -0.898624+0.032346j])

sort(v1,v2)

Out:  np.array([-0.993598-0.108516j, -1.0052  -0.10133j, 
                -0.990341-0.110104j, -0.990036-0.110244j, 
                 0.991379-0.109617j, -0.898624+0.032346j])

在这种情况下,正确的排序是在这种特定情况下交换v2 [0]和v2 [1]。由于彼此之间的值都略有变化,因此仅查看一个值并找到最接近v1中值的单个位置是不够的。

编辑:我更改了示例,并添加了该函数的输出。

编辑2:在numpy数组中添加了缺少的逗号

1 个答案:

答案 0 :(得分:3)

这是我的尝试:

;With CTE1 as (
    SELECT c1.customer,group,MAX(s2.dt_created) as MaxInGroup
    FROM customers c1
    INNER JOIN (select customer, dt_created,2 as group from archive_orders
    union all select customer, dt_created,1 from orders) s2
    ON c1.customer = s2.customer
    GROUP BY c1.customer,group
), CTE2 as (
    SELECT *,ROW_NUMBER() OVER (PARTITION BY customer ORDER BY group) as rn
    from CTE2
)
select * from CTE2 where rn = 1

输出与import numpy as np from scipy import optimize def match(v1, v2, dist): assert v1.ndim == v2.ndim == 1 assert v1.shape[0] == v2.shape[0] n = v1.shape[0] t = np.dtype(dist(v1[0], v2[0])) dist_matrix = np.fromiter((dist(x1, x2) for x1 in v1 for x2 in v2), dtype=t, count=n*n).reshape(n, n) row_ind, col_ind = optimize.linear_sum_assignment(dist_matrix) return v2[col_ind] v1 = np.array([-0.99418 -0.106364j, -1.005974-0.099054j, -0.991923-0.107482j, -0.990868-0.107976j, -0.990558-0.108118j, -0.898555+0.035351j]) v2 = np.array([-1.0052 -0.10133j, -0.993598-0.108516j, 0.991379-0.109617j, -0.990341-0.110104j, -0.990036-0.110244j, -0.898624+0.032346j]) v2_matched = match(v1, v2, lambda x1, x2: abs(x1 - x2)) print(repr(v2_matched)) # => # array([-0.993598-0.108516j, -1.0052 -0.10133j , -0.990341-0.110104j, # -0.990036-0.110244j, 0.991379-0.109617j, -0.898624+0.032346j]) 的输出相同。

如您所见,您可以插入其他lambda或函数作为距离。

我不是numpy的专家,可能存在计算距离矩阵sort()的捷径。

感谢@Jonas标识“ assignment problem”。