我有一个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"])
我已经做到了这一点,但它非常难看,我认为有一种更有效的方法。
答案 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