numpy中的向量对排序
Posted
技术标签:
【中文标题】numpy中的向量对排序【英文标题】:Vector pair ordering in numpy 【发布时间】:2014-07-16 02:36:57 【问题描述】:我希望通过第一个不相等的元素对一对向量进行排序。示例:
[0, 1, 2] < [0, 2, 1]
因为 0 == 0 所以看下一个索引,其中 1
在 numpy 中是否有一种简单的方法可以做到这一点?现在我正在使用它来查找“更大”和“较小”向量之间的差异,这导致了我的第一次尝试,即:
(x - y) * np.sign((x - y)[np.nonzero(x - y)[0][0]])
【问题讨论】:
您是否真的需要知道如何以这种方式比较向量,或者这只是您最后提到的进行差异计算的一种手段? 我只在差分计算中使用它,但这是比较向量的一种相当常见的方法,所以我希望有一些 Numpy 函数,或者一些众所周知的函数,在我一直想不出的名字。但也许不是。 【参考方案1】:您可以使用元组:(0,1,2)<(0,2,1)
。所以像
def cmp(v1, v2): return tuple(v1) < tuple(v2)
应该够了……
【讨论】:
【参考方案2】:np.lexsort
可能是最有效的方法:
import numpy as np
# an (N, k) array of N k-dimensional vectors
data = np.array([[0, 2, 3], [0, 1, 2], [0, 1, 3], [0, 2, 1]])
print data
# [[0 2 3]
# [0 1 2]
# [0 1 3]
# [0 2 1]]
# lexsort assumes (k, N), so transpose data first. we also need to reverse the
# order of the columns, since lexsort sorts by the last column first
idx = np.lexsort(data[:, ::-1].T)
print data[idx]
# [[0 1 2]
# [0 1 3]
# [0 2 1]
# [0 2 3]]
【讨论】:
【参考方案3】:我敢打赌,通过两个数组进行简单循环会更快
def comparison(a,b):
for i in xrange(len(a)): #assuming they have to be the same length
if a[i] < b[i]:
return True
elif a[i] > b[i]:
return False
return False
对于您发布的 3 个元素向量,在我的机器上迭代速度提高了 7 倍。对于足够大的相同初始元素的延伸,迭代将变得更慢,但在进行矢量化之前确保是这种情况。
【讨论】:
以上是关于numpy中的向量对排序的主要内容,如果未能解决你的问题,请参考以下文章