在numpy的传染媒介配对

时间:2014-07-16 02:36:57

标签: python numpy

我希望通过第一个inequal元素来命令一对向量。例如:

[0, 1, 2] < [0, 2, 1]

因为0 == 0所以看下一个索引,其中1&lt; 2。

有一种简单的方法可以在numpy中执行此操作吗?现在我用它来找到&#34;更大&#34;之间的区别。和&#34;较小的&#34;矢量,这导致我的第一次尝试,这是:

(x - y) * np.sign((x - y)[np.nonzero(x - y)[0][0]])

3 个答案:

答案 0 :(得分:3)

您可以使用元组:(0,1,2)<(0,2,1)。所以像

这样的功能
def cmp(v1, v2): return tuple(v1) < tuple(v2)

应该足够......

答案 1 :(得分:1)

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]]

答案 2 :(得分:0)

我敢打赌通过两个数组进行简单的循环会更快

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倍。对于足够大的相同初始元素的延伸,迭代将变慢,但确保在进行矢量化之前就是这种情况。