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

时间:2015-10-05 14:31:22

标签: python sorting numpy

我有一个numpy数组:

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

现在我有一个矢量化的Levenshtein编辑距离函数,它测量给定字符串与给定数组的距离,例如,对于字符串ab

l_distv("ab", a)

返回:

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

我想以某种方式对数组进行排序,以便编辑距离小于2的任何元素移动到第一个位置,而其余元素移动到它们后面而不更改它们的顺序。结果将是:

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

我已经做到了这一点,但它非常难看,我认为有一种更有效的方法。

4 个答案:

答案 0 :(得分:3)

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

dictionary = dict(zip(a,array))

然后根据编辑距离

对字典进行排序
sorted_dictionary = sorted(dictionary.items(), key=operator.itemgetter(1))

答案 1 :(得分:2)

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

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

示例运行 -

In [144]: a
Out[144]: 
array(['dcba', 'abc', 'bca', 'bcda', 'tda', 'a'], 
      dtype='|S4')

In [145]: dists
Out[145]: array([3, 1, 3, 4, 3, 0]) # Different from listed sample to 
                                    # show how it handles sorting

In [146]: sort_idx = dists.argsort()

In [147]: mask = dists < 2

In [148]: np.concatenate((a[sort_idx[mask[sort_idx]]],a[~mask]))
Out[148]: 
array(['a', 'abc', 'dcba', 'bca', 'bcda', 'tda'], 
      dtype='|S4')

上述方法连接了a的两个索引部分,这在运行时方面可能效率不高。因此,考虑到性能,您可以创建一个连接的索引数组,然后在a中使用它编入one-go索引。因此,必须改变先前实现的最后一行 -

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

答案 2 :(得分:1)

如果你想保留排序并且只想在前面放置一个小于2的l_dist元素,我可以建议一个答案:

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

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

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

a[indices] #returns all elements where the l_dist returns smaller than 2
a[~indices] #returns everything >= 2

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

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

但可能是我误解了这个问题并且您不想保留初始排序(您的示例结果似乎表明了这一点)并且确实排序了。

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

答案 3 :(得分:0)

您可以使用> str(data2$smoker) Factor w/ 3 levels "","No","Yes": 2 2 2 2 2 2 2 3 3 2 ... zip来获得结果。

sorted
相关问题