Цикл по нескольким массивам с np.where - PullRequest
4 голосов
/ 19 июня 2019

У меня есть 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] поэтому соответствующее значение для пола должно быть 1

distance[1] is 255

, так как это между distance_boundary [1] и distance_boundary [2] поэтому соответствующее значение для пола должно быть 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 ]

3 голосов
/ 19 июня 2019

np.searchsorted - это то, что вы ищете:

np.searchsorted(distance_boundary, distance)
# array([1, 2, 2, 1, 1, 1])
1 голос
/ 19 июня 2019

Если ваши границы всегда кратны 100, это будет работать:

Код:

[int(str(q)[0:-2]) for q in distance]

Из:

[1, 2, 2, 1, 1, 1]
1 голос
/ 19 июня 2019

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)
1 голос
/ 19 июня 2019

Вы можете использовать итеративный подход. Суммируйте результат двоичных порогов, используя каждое значение в 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]
1 голос
/ 19 июня 2019

Вы можете попробовать это:

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]
1 голос
/ 19 июня 2019

Использование 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...