2016-12-20 3 views
1

두 개의 같은 크기의 목록이 있다고 가정합니다. 첫 번째 목록에는 0과 1 만 포함되며 두 번째 목록의 초기 값은 고정 된 숫자와 같습니다. 두 번째 배열의 다른 값은 첫 번째 목록의 동일한 색인 값에 따라 다릅니다. 이들 사이의 관계는 첫 번째 목록의 값이 0 인 경우 두 번째 목록의 동일한 색인 값이 이전 색인과 같고 다른 모든 경우는 다른 값과 같습니다. 내 질문을 명확히하기 위해 for 루프의 도움으로 아래 코드를 작성했습니다. for 루프없이 문제를 해결하는 방법은 무엇입니까?numpy 배열의 논리적 반복

Code 
a = np.array([0, 1, 0, 0, 0, 1, 0, 0, 1]) 
b = np.zeros_like(a) 
b[0] = 5 
for i in range(1, a.size): 
    if a[i] == 0: 
     b[i] = b[i-1] 
    else: 
     b[i] = np.random.randint(5) 
+0

시공 명시 적으로 이전의 반복에 의존하기 때문에, 전혀은 벡터화 할 수 없습니다 간단합니다. 꼭 그런 것은 아닙니다 * 어렵지만 어렵습니다. –

+0

'a' 배열에 인접한 배열이 없다면 쉽게 할 수 있습니다. 그럴 수 있니? –

+0

알아, 어렵다. 하지만, "scipy.signal.lfiler"기능과 같은 직접적인 해결책이 있는지 여부를 찾으려고합니다. 이 함수를 사용하면 이전의 수치에 의존하는 수치 적 반복을 수행 할 수 있습니다. –

답변

2

는 여기 벡터화 된 접근 방식 -

offset = int(a[0]!=0) 
N = (np.count_nonzero(a!=0)) - offset # no. of rand num to be generated 
rand_num = np.append(5,np.random.randint(0,5,N)) 
out = rand_num[(a!=0).cumsum() - offset] 
+0

내부에 새로운 randoms를 생성하는 대신, 동일한 값을 유지합니다. 'a = np.array ([0, 1, 0, 0, 1, 1, 0, 0, 1])'로 실행하면 두 번째 값도 5가 될 것으로 예상됩니다. 내가 그 질문을 오해하지 않는 이상. –

+0

@AndrasDeak'a [i]! = 0 :'는 ELSE 부분에 들어가서'[0,5]'에 새 번호를 생성해야하기 때문에 그 두 번째 위치의 경우가 적당합니다. 그래서 우리는 두 번째 위치에 임의의 숫자를 가질 것입니다, 그렇죠? – Divakar

+0

좋은 해결책! 그러나 0과 1 대신에 문자열이 있다면 (예를 들어 'a'와 'b')? –