我有2个列表distance_boundary和distance
distance_boundary = [100,200,300]
distance = [125,255,285,140,160,180]
现在,我想创建一个新的变量 floor ,我想根据距离值分配地板的值,该值由distance_boundary定义
例如,
distance[0] is 125
因为这是在distance_boundary [0]和distance_boundary [1]之间 因此对应的floor值应为1
distance[1] is 255
因为这是在distance_boundary [1]和distance_boundary [2]之间 所以对应的floor值应该是2
遍历这个值应该给我地板的最终价值为
floor = [1,2,2,1,1,1]
我试图遍历距离并习惯于np.where进行分配
floor = []
for j in range(0,len(distance)):
floor = (np.where((distance[j]>distance_boundary[0]) & (distance[j]>distance_boundary[1]))
,1,2)
floor.append(floor)
这没有给我期望的结果,而且它看起来也不是可扩展的。 还有其他更好的解决方案
答案 0 :(得分:3)
np.searchsorted
似乎是您想要的:
np.searchsorted(distance_boundary, distance)
# array([1, 2, 2, 1, 1, 1])
答案 1 :(得分:1)
使用pandas.cut
:
import pandas as pd
distance_boundary = [100,200,300]
distance = [125,255,285,140,160,180]
[distance_boundary.index(i.right) for i in pd.cut(distance, distance_boundary)]
输出:
[1, 2, 2, 1, 1, 1]
答案 2 :(得分:1)
您可以尝试以下方法:
import numpy as np
distance_boundary = np.array([100,200,300])
distance = np.array([125,255,285,140,160,180])
floor = np.zeros_like(distance)
flag = (distance > 100) & (distance < 200)
floor[flag] = 1
flag = (distance > 200) & (distance < 300)
floor[flag] = 2
print(floor)
>>>[1 2 2 1 1 1]
答案 3 :(得分:1)
您可以使用迭代方法。使用distance_boundary
中的每个值作为阈值,对二进制阈值的结果求和:
import numpy as np
distance_boundary = np.array([100,200,300])
distance = np.array([125,255,285,140,160,180])
print(sum(np.where(distance > i, 1, 0) for i in distance_boundary))
这将打印:
[1 2 2 1 1 1]
答案 4 :(得分:1)
O(N log N)解决方案:
from bisect import bisect_left
def binarySearch(num, arr):
i = bisect_left(arr, num)
if arr[i] == num:
return i+1
else:
return i
distance_boundary = [100,200,300]
distance = [125,255,285,140,160,180]
floor = list()
for num in distance:
floor.append(binarySearch(num, distance_boundary))
print("floor =", floor)
答案 5 :(得分:1)
如果边界始终是100的倍数,则可以使用:
代码:
[int(str(q)[0:-2]) for q in distance]
出局:
[1, 2, 2, 1, 1, 1]