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)&lt;(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中的向量对排序的主要内容,如果未能解决你的问题,请参考以下文章

第四十二篇 Numpy的基本操作——索引相关

从 Numpy 中的 N 个向量中找到所有唯一的(几乎)平行 3d 向量对的最快方法

Python: 向量矩阵和多维数组(基于NumPy库)

Python Numpy中的几个矩阵乘法

对向量中的点进行排序以形成轮廓

从2个numpy向量生成数字对数组[重复]