2014-01-20 2 views
2

numpy에서 정수 인덱스를 결합하는 방법을 아는 사람이 있습니까? 특히, 나는 약간의 결과를 얻었고 그들 사이에 공통적 인 요소를 추출하고 싶다.정수 인덱스를 numpy에 논리적으로 결합하는 방법은 무엇입니까?

문맥에서 각 셀의 경계 값 사이에있는 요소의 수를 큰 3d 배열로 채우려고합니다. 즉, 시간, 위도 및 경도를 포함한 개별 이벤트 레코드가 있습니다. 3D 주파수 행렬에 격자를 그리기를 원합니다. 차원은 시간, 위도, 경도입니다.

np.where(timeCondition & latCondition & lonCondition)을 수행하는 배열 요소를 반복 할 수 있는데, 결과의 길이는 채우지 만 where을 반복해야하므로 매우 비효율적이라고 생각했습니다.

각 차원의 각 셀에 대해 wheres 목록을 가지고 논리적으로 결합하여 루프하는 것이 더 좋을까요?

+3

는'np.where (timeCondition & latCondition & lonCondition가)'실제로보다 훨씬 빨리해야한다 각 조건에 대해 개별적으로'np.where'를 호출합니다. 즉, 한 번만 각 요소를 반복합니다. –

+0

효율성이 향상되는 한, 문제는 np.where의 개별 조건이 반복되는 부분입니다. 예를 들어, 경도 점을 반복 할 때 np.where (timeCondition & latCondition & lonCondition1) 다음에 np.where (timeCondition & latCondition & lonCondition2)가 표시됩니다. 즉, 아무 이유없이 timeCondition & latCondition을 두 번 이상 검색해야합니다. 나는 그 모든 것들을 한 번 해보고 목록에 꽂아서 요소를 비교할 수 있다면 더 빨리해야한다고 생각했습니다. 그게 옳은가요? – nrob

+2

어떤 조건을 사용 하느냐에 따라 인덱스 대신 마스크를 곱하면됩니다. 좋은 분해 결과를 얻기 위해 행렬 분해 알고리즘의 일부 루프를 최적화하는 데 사용했습니다. –

답변

3

@ali_m 말했듯이, 비트를 사용하여 훨씬 더 빨리해야하지만, 귀하의 질문에 대답 : 1-어두운 색인에 멀티 어두운 색인을 변환하는

  • 전화 ravel_multi_index()합니다.
  • intersect1d()으로 전화하면 두 가지 조건 모두에서 색인을 얻을 수 있습니다.
  • 1 색 색인을 다차원 색인으로 다시 변환하려면 unravel_index()으로 호출하십시오. 여기

코드입니다 :

import numpy as np 

a = np.random.rand(10, 20, 30) 

idx1 = np.where(a>0.2) 
idx2 = np.where(a<0.4) 

ridx1 = np.ravel_multi_index(idx1, a.shape) 
ridx2 = np.ravel_multi_index(idx2, a.shape) 
ridx = np.intersect1d(ridx1, ridx2) 
idx = np.unravel_index(ridx, a.shape) 

np.allclose(a[idx], a[(a>0.2) & (a<0.4)]) 

또는 직접 ridx를 사용할 수 있습니다

a.ravel()[ridx] 
+2

당신은 확실히 내 질문에 대답했지만, 나는 다른 방식으로 문제를 해결했다. 효과적으로 np.where 측면을 건너 뛸 수있는 가장 효율적인 솔루션을 찾았습니다. 즉, 각 차원에 대한 부울 배열 목록을 만든 다음 논리적으로 앰퍼샌드와 결합했습니다. – nrob

관련 문제