我不确定这个问题的标题应该是什么。但是我们说我们有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]
答案 0 :(得分:1)
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])]