我有两个向量(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数组中添加了缺少的逗号
答案 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”。