2017-01-07 13 views
3

Это было не лучшее описание в названии, но я, надеюсь, опишу свою проблему ниже. Там действительно две части.Увеличьте элементы массива numpy на 1 по определенным индексам (для использования с группировкой таблицы астрометрии)

Конечная вещь, которую я пытаюсь сделать, это группировать определенные моменты вместе в таблице астрофизики - поскольку значения не совпадают для каждого времени, которое попадет в определенную группу, я не верю, что могу просто дать имя столбца в методе group_by().

Итак, я пытаюсь создать массив, описывающий, с какой группой каждый раз ассоциироваться, чтобы передать это в group_by(). Я могу получить бинов края, выполняя, например, (10 произвольно),

>>> np.where(np.diff(table['Times']) > 10)[0] 
array([ 2, 8, 9, 12]) 

Допустим, таблица имеет длину 15. То, что я хочу знать, как это можно было бы использовать этот массив выше для создать следующий массив без необходимости использовать циклы

array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4]) 

таким образом, что, когда я поместить этот массив в методе group_by() это группа таблицу в соответствии с этими бин краев.

Альтернативно, если есть лучший способ группировки таблицы астрометрии в соответствии с временными диапазонами.

ответ

2

Это звучит как np.digitize должны делать то, что вы хотите. Используя arr вместо вашего стола, попробуйте

arr = np.array([1,2,3,15, 16, 17, 17, 18, 19, 30,41,42, 43, 55, 56]) 
bin_edges = arr[np.where(np.diff(arr) > 10)[0]] 
indices = np.digitize(arr, bin_edges, right=True) 
print indices 
2

Один подход с np.repeat -

def repeat_based(bin_edges, n): 
    reps = np.diff(np.hstack((-1,bin_edges,n-1))) 
    return np.repeat(np.arange(bin_edges.size+1),reps) 

Другой подход с np.cumsum -

def cumsum_based(bin_edges, n): 
    id_arr = np.zeros(n,dtype=int) 
    id_arr[bin_edges+1] = 1 
    return id_arr.cumsum() 

Пример запуска -

In [400]: bin_edges = np.array([ 2, 8, 9, 12]) 

In [401]: repeat_based(bin_edges, n = 15) 
Out[401]: array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4]) 

In [402]: cumsum_based(bin_edges, n = 15) 
Out[402]: array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4])