用条件对数组排序的有效方法

2024-09-27 23:23:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy阵列:

a = np.array(["dcba", "abc", "bca", "bcda", "tda", "a"])

现在我有一个向量化的Levenshtein edit distance函数,它测量给定数组中给定字符串的距离,例如,对于string ab

^{pr2}$

退货:

array([3, 1, 3, 4, 3, 1])

我想对数组进行排序,这样任何编辑距离小于2的元素都会移动到第一个位置,而其余元素则在不改变顺序的情况下移到后面。所以结果是:

array(["abc", "a", "dcba", "bca", "bcda", "tda"])

我已经做过了,但是很难看,我想还有一种更有效的方法。在


Tags: 函数numpy元素距离np数组arrayedit
3条回答

假设这些距离值存储在数组dists中,这里有一种方法-

sort_idx = dists.argsort()
mask = dists < 2
out = np.concatenate((a[sort_idx[mask[sort_idx]]],a[~mask]))

样本运行-

^{pr2}$

上面的方法连接了a的两个索引部分,从运行时来看,这可能不是很有效。因此,考虑到性能,您可以创建一个串联索引数组,然后用它在one-go中索引到a。因此,前一个实现的最后一行必须更改,如-

out = a[np.concatenate((sort_idx[mask[sort_idx]],np.where(~mask)[0]))]

如果您想保留顺序,只想将小于2的l_dist元素放在前面,我可以给出一个答案:

我认为您应该从创建索引数组开始

indices = l_distv("ab", a) < 2 # you wanted to move evrything below 2 at the front

这可以很容易地用作掩码索引,例如

^{pr2}$

所以您可以通过组合这两个来重建sorted数组。在

res = np.concatenate((a[indices], a[~indices]))

我想让你的问题保持原样,但我不想让这个问题继续下去。在

我不知道这是否真的有效,但它有效。在

在字典中添加元素和编辑距离

dictionary = dict(zip(a,array))

然后根据编辑距离对字典进行排序

^{pr2}$

相关问题 更多 >

    热门问题