使用np.where遍历多个数组

时间:2019-06-19 05:16:21

标签: python loops numpy

我有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)

这没有给我期望的结果,而且它看起来也不是可扩展的。 还有其他更好的解决方案

6 个答案:

答案 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]