2013-06-28 7 views
1

두 개의 배열이 있습니다. 첫 번째 Z1은 길이가 약 300,000 행 3 열입니다. 두 번째 Z2는 약 200,000 개의 행과 300 개의 열입니다. 각 Z1 및 Z2의 각 행에는 식별 번호 (10 자리)가 있습니다. Z2는 Z1에있는 항목의 하위 집합을 포함하고 있으며 Z2의 행을 Z1의 파트너와 10 자리의 식별 번호를 기준으로 일치시킨 다음 Z1에서 2와 3 열을 가져 와서 Z2의 끝에 삽입합니다. 그들의 적절한 행.numpy 배열의 요소 일치

Z1 및 Z2는 특정 순서가 아닙니다.

이 작업을 수행하는 유일한 방법은 시간이 걸리는 배열을 반복하는 것입니다. 파이썬에서 더 좋은 방법이 있나요?

감사합니다.

답변

2

귀하의 질문에 10 자리 식별자가 1 열에 저장되어있는 것으로 알고 있습니다. 맞습니까?

이 따라야하는 것은 매우 쉬운 일이 아닙니다, 간접 많이 진행했지만 결국 unsorted_insert 지금 Z1Z2의 각 식별자 그래서

sort_idx = np.argsort(Z1[:, 0]) 
sorted_insert = np.searchsorted(Z1[:, 0], Z2[:, 0], sorter=sort_idx) 
# The following is equivalent to unsorted_insert = sort_idx[sorted_insert] but faster 
unsorted_insert = np.take(sort_idx, sorted_insert) 

곳의 행 번호를 가지고 모든 우리는 필요

new_Z2 = np.hstack((Z2, Z1[unsorted_insert, 1:])) 

: 어떻게 그 행의 마지막 두 열을 취득 Z2 배열로 스택하는 것입니다 문제없이 실행되는 작성된 예 :

import numpy as np 

z1_rows, z1_cols = 300000, 3 
z2_rows, z2_cols = 200000, 300 

z1 = np.arange(z1_rows*z1_cols).reshape(z1_rows, z1_cols) 

z2 = np.random.randint(10000, size=(z2_rows, z2_cols)) 
z2[:, 0] = z1[np.random.randint(z1_rows, size=(z2_rows,)), 0] 

sort_idx = np.argsort(z1[:, 0]) 
sorted_insert = np.searchsorted(z1[:, 0], z2[:, 0], sorter=sort_idx) 
# The following is equivalent to unsorted_insert = sort_idx[sorted_insert] but faster 
unsorted_insert = np.take(sort_idx, sorted_insert) 
new_z2 = np.hstack((z2, z1[unsorted_insert, 1:])) 

시간이 초과되지 않았지만 모든 작업이 몇 초 내에 완료된 것으로 보입니다.

+0

이 유망 보이지만, 그것은 나에게 오류 던지고 : searchsorted searchsorted 대가로, 라인 (807), 파일 "/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric.py"(절 , side) ValueError : 'side'키워드에 대해 비어 있지 않은 예상 문자열 'Z1 [:, 0], Z2 [:, 0] 주위에 괄호를 넣었을 때 발생하지 않는 것처럼 보입니다. 그러나 실행하기 위해 영원히 걸립니다. – DathosPachy

+0

아,하지만 괄호가있는 줄 2에 대한 또 다른 오류가 있습니다 : sorted_insert = np.searchsorted ((Z1 [:, 0], Z2 [:, 0])), sort_idx) 파일 "/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric.py", 줄 806, 검색 결과 return _wrapit (a, 'searchsorted', v, side) 파일 "/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric.py", 줄 37, _wrapit에 있음 결과 = getattr (asarray (obj), method) (* args, ** kwds) ValueError : 둘 이상의 요소가있는 배열의 진리 값이 모호합니다. a.any() 또는 a.all()을 사용하십시오. – DathosPachy

+0

@DathosPachy 제 응답에 샘플 데이터를 일부 추가했습니다. 중요한 문제없이 실행할 수 있습니다. numpy의 어떤 버전을 사용하고 있습니까? 최신 1.7 업데이트 옵션이 있습니까? – Jaime