【问题标题】:Given distances and values array, return sorted filtered values in numpy给定距离和值数组,在 numpy 中返回排序后的过滤值
【发布时间】:2018-01-16 01:43:43
【问题描述】:

我不确定这个问题的标题应该是什么。但是假设我们有 2 个数组、值和距离。

values = np.array([[-1,-1,-1],
                   [1, 2, 0],
                   [-1,-1,-1]])

distances = np.array([[1,2,3],
                      [6,5,4],
                      [7,8,9]])

我想获取非负值,并根据距离数组按其对应的距离对它们进行排序。

所以在上面的例子中,正值是[1,2,0],它的距离是[6,5,4]。因此,如果按其对应的距离排序,我希望[0,2,1] 作为答案。

我的代码如下。它可以工作,但希望有只使用 numpy 的解决方案。我相信这会比这更有效率:

import numpy as np   
import heapq

def get_sorted_values(seek_val, values, distances):
    r, c = np.where(values >= seek_val)

    di = distances[r, c]
    vals = values[r, c]

    print("di", di)
    print("vals", vals)

    if len(di) >= 1:

        heap = []
        for d, v in zip(di,vals):
            heapq.heappush(heap, (d,v))

        lists = []
        while heap:
            d, v = heapq.heappop(heap)
            lists.append(v)

        return lists

    else:
        ## NOTHING FOUND
        return None

输入:

seek_val = 0
values = np.array([[-1,-1,-1],
                   [1,2,0],
                   [-1,-1,-1]])
distances = np.array([[1,2,3],
                      [6,5,4],
                      [7,8,9]])

print("Ans:",get_sorted_values(seek_val, values, distances))

输出:

di [6 5 4]
vals [1 2 0]
Ans: [0, 2, 1]

【问题讨论】:

    标签: python arrays sorting numpy


    【解决方案1】:

    “一个班轮”:

    values[np.where(values >= 0)][np.argsort(distances[np.where(values >= 0)])]  
    
    Out[981]: array([0, 2, 1])  
    

    重复np.where(values >= 0) 效率低下,如果values 很大,可能会产生变量

    v_indx = np.where(values >= 0)
    values[v_indx][np.argsort(distances[v_indx])]
    

    【讨论】:

      【解决方案2】:

      试试np.argsort

      import numpy as np
      values = np.array([[-1,-1,-1],
                         [ 1, 2, 0],
                         [-1,-1,-1]])
      distances = np.array([[1, 2, 3],
                            [6, 5, 4],
                            [7, 8, 9]])
      print(values[values >= 0])
      # [1 2 0]
      print(distances[values >= 0])
      # [6 5 4]
      print('Ans:', values[values >= 0][np.argsort(distances[values >= 0])])
      # Ans: [0 2 1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        • 2018-07-07
        • 2021-10-05
        • 1970-01-01
        相关资源
        最近更新 更多