Разделить на равные части по значениям - PullRequest
0 голосов
/ 22 мая 2018

Есть ли удобный способ разбить массив таким образом, чтобы независимо от количества элементов в каждом разделе диапазон значений, который он содержит, был одинаковым?

Скажем, у нас есть данные в диапазоне (0, 100).Пусть размер массива будет 1000. Первые 500 элементов находятся в (0, 20), 300 элементов в (20, 40) и так далее.Я хотел бы манипулировать значениями в подразделах, разделенных на 20, 40, 60 и 80.

Данные могут выглядеть примерно так:

1st div:  0,  0,  0, ... 17, 18
2nd div: 22, 22, 24, ... 37, 39
3rd div: 40, 41, 41, ... 55, 59
4th div: 65, 68, 73, 76, 76
5th div: 93, 96

Разделить массив очень легков равных по размеру разделах по размеру раздела.Но я строю линию тренда, используя простое усреднение, и объем данных в каждом разделе варьируется.Я знаю точки разделения.

Это может быть сделано с помощью np.where с условием, подобным arr > border1, которое берет только первый элемент, объединяет и затем разделяет, но это похоже на длительный способ ведения дел..

Любые указатели будут с благодарностью.Я не могу быть единственным с этой проблемой.Кроме того, если другая библиотека делает подобные вещи, я, безусловно, буду готов ее использовать.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Если входные элементы уже отсортированы, рассмотрите использование groupby:

import itertools

l=[0,1,5,17,18,22,27,37,39,40,41,48,57,65,68,72,77,79,81,85,88,91,99]

for k, v in itertools.groupby(l, key=lambda x: x//20):
    # k=0, v=[0, 1, 5, 17, 18]
    # k=1, v=[22, 27, 37, 39]
    # k=2, v=[40, 41, 48, 57]
    # ...
0 голосов
/ 22 мая 2018

Используйте np.searchsorted, чтобы получить те индексы, которые будут разбиты на группы, а затем разделить их с помощью np.split -

In [41]: np.random.seed(0)

In [42]: a = np.sort(np.random.randint(0,100,(10000)))

In [43]: bins = [20,40,60,80]

In [46]: idx = np.searchsorted(a, bins)

In [47]: np.split(a,idx)
Out[47]: 
[array([ 0,  0,  0, ..., 19, 19, 19]),
 array([20, 20, 20, ..., 39, 39, 39]),
 array([40, 40, 40, ..., 59, 59, 59]),
 array([60, 60, 60, ..., 79, 79, 79]),
 array([80, 80, 80, ..., 99, 99, 99])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...