2014-11-30 5 views
1

내가 가지고있는은 특정 샘플 (길이가 samplesize)인지 여부를 정보를 저장하는 데이터와 부울 배열이있는 큰 차원이 아닌 1 차원 np.int16 배열입니다. 데이터가 일부 기준 (유효 함) 또는 적합하지 않음 (유효하지 않음)에 적합합니다. 나는 이런 식으로 뭔가 뜻은 다음과 같습니다 membership[0]Numpy : 값 배열에 따라 배열로 배열을 분할

samplesize = 5 
data = array([1, 2, 3, 4, 5, 3, 2, 1, 3, 2, 4, 5, 2, 1, 1], dtype=int16) 
membership = array([False, True, False], dtype=bool) 

data[ 0*samplesize : 1*samplesize ]가 유효한지 여부를 확인합니다.

내가 원하는 것은 회원 배열의 값이 True 인 순서대로 데이터 배열을 청크로 분할하는 것입니다. 예를 들어, membership이 포함되어 있고 연속적인 True 문인 경우 data의 의미있는 샘플이라고 판단됩니다. 우리 start[i]end[i] 같은 시퀀스의 끝으로 i 번째의 시퀀스의 시작을 식별 한 가정

True, True, True , True - valid sequence 
True, True, False, True , True - invalid sequece 

, 난에서 시작 피스로의 data 어레이를 분할 할 start[i] * samplesize이고 마지막으로 end[i] * samplesize입니다.

어떻게해야합니까?

+0

을하고 어디있어 문제? – sebix

+0

알려진 인덱스 목록으로 만 나눌 수 있기 때문에'np.split'을 사용할 수 없습니다. 나는'membership' 배열을 분석함으로써 갈라짐을위한 모서리를 발견 할 필요가 있습니다 - 그것은 연속적인'True' 문장의 시작과 끝 인덱스를 찾는 방법입니다. – xolodec

+0

조건 분할을 사용할 수 없습니다. 나는'itertools.groupby'에 대해 생각했지만 더 효율적인 해결책이있을 수 있는지 궁금합니다. – xolodec

답변

2

질문을 이해할 수 없습니다. 시작 & 끝 인덱스를 membership으로 3 개 이상 연속으로 가져 오시겠습니까? 여기

는 기본적인 아이디어는 diff(membership) 인 것이 수행과 상승 에지와 하강 에지의 인덱스 얻을 수있는 코드 : 이미 np.split``로 시도 무엇

import numpy as np 
membership = np.random.randint(0, 2, 100) 
d = np.diff(np.r_[0, membership, 0]) 
start = np.where(d == 1)[0] 
end = np.where(d == -1)[0] 
mask = (end - start) >= 3 
start = start[mask] 
end = end[mask] 

for s, e in zip(start, end): 
    print s, e, membership[s:e] 
+0

감사합니다. 나는'mask = (end-start)> = 3'이 가능하다는 것을 몰랐다. 고마워. 나는 그러한 벡터화 계산법을 정확히 찾고있었습니다. – xolodec

관련 문제