【问题标题】:Numpy: give back an array with the n entries closest to a given numberNumpy:返回一个数组,其中 n 个条目最接近给定数字
【发布时间】:2017-11-14 13:32:36
【问题描述】:

我有一个 numpy 数组 arr,我想用旧数组的 n 元素创建一个新数组,这些元素最接近给定数字 x。我在这里找到了一个有用的答案 (I have need the N minimum (index) values in a numpy array),但我的代码看起来很笨拙(我是 Python 的初学者):

def give_array_with_closest(x, n, arr):
    newar = np.absolute(arr - (np.ones(len(arr)) * x)) #Subtract x from all array entries and take absolute value, so that the lowest entries are the ones closest to x
    indexar = (newar).argsort()[:n] #get array with indices from n lowest entries of newar
    result = np.empty(n)
    for i in range(n):
        result[i] = arr[indexar[i]]
    return result

由于我对索引不感兴趣,而只对实际条目感兴趣,因此在这种情况下,其他问题的解决方案可能不是最好的。有没有更有效和更简单的方法来做到这一点?

【问题讨论】:

    标签: python arrays python-2.7 numpy


    【解决方案1】:
    • 已经提到你不需要for循环来获取索引的值,你可以简单地使用argsort的结果来索引数组(至少如果你的数组是1D)。

    • 但您也不需要sort 整个数组。你可以简单地使用argpartition。这可能比排序更快。

    • 另外一点:您可以使用矢量化操作,例如arr - 1。这将从每个元素中减去一个,而无需手动创建新数组(例如您的 np.ones(len(arr)))。

    所以把这些放在一起:

    def give_array_with_closest(x, n, arr):
        indexarr = np.argpartition(abs(arr - x), n)[:n]
        return arr[indexarr]
    

    还有测试:

    >>> give_array_with_closest(2, 3, np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
    array([2, 3, 1])
    

    【讨论】:

      【解决方案2】:

      您可以通过提供索引来一次性创建新数组:

      def give_array_with_closest2(x, n, arr):
          newar = np.absolute(arr - (np.ones(len(arr)) * x)) 
          return arr[(newar).argsort()[:n]] 
      

      所以实际上这是相同的代码,但更优雅,可能更快。

      【讨论】:

        猜你喜欢
        • 2014-11-15
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        相关资源
        最近更新 更多