2017-01-07 3 views
3

제목에 가장 잘 설명 된 것은 아니지만 아래에서 내 문제를 설명 할 수 있습니다. 거기에는 정말 두 부분이 있습니다.특정 색인에서 numpy 배열 요소를 1 씩 증가시킵니다 (천체 표 그룹화와 함께 사용)

내가하려는 일은 궁극적으로 astropy 테이블 내에서 특정 시간을 그룹으로 묶는 것입니다. 특정 그룹에 들어갈 때마다 값이 같지 않기 때문에 나는 단지 줄 수 있다고 믿지 않습니다. group_by() 메서드의 열 이름

그래서, 나는 group_by()에 전달할 수 있도록 매번 어떤 그룹과 연관되는지 설명하는 배열을 생성합니다. 나는

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

이의이 내가 알고 싶은 것은 그것으로 위의 해당 배열을 사용할 수있을 어떻게 테이블의 길이 (15)를 가지고 있다고 가정 해 봅시다 (10 임의이다) 예를 들어, 수행하여 빈 가장자리를 얻을 수 있습니다 루프
array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4]) 

를 사용할 필요없이 다음과 같은 배열을 생성되도록 I 그 빈 모서리에 따른 GROUP_BY() 메소드에서 그룹 테이블을 그 배열을 놓으면.

또는 시간 대별로 천체 표를 그룹화하는 더 좋은 방법이있는 경우. np.cumsum

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.repeat

답변

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

한 가지 방법은

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])