给定距离和值数组,返回numpy

时间:2018-01-16 01:43:44

标签: python arrays sorting numpy

我不确定这个问题的标题应该是什么。但是我们说我们有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]

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

“one liner”:

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