【问题标题】:Vector pair ordering in numpynumpy中的向量对排序
【发布时间】: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 函数,或者一些众所周知的函数,在我一直想不出的名字。但也许不是。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-28
        • 2013-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多