2012-09-27 8 views
0

중복을 포함 할 수있는 데이터 세트가 있습니다. 내가 NumPy와 구조화 된 배열로 인덱스를 넣어 데이터 세트에서 중복을 발견하기 위해, 두 배열의 길이를 비교 한 후 고유 한 값에서 다른 배열을 생성, 배열을 정렬 :두 개의 numpy 구조화 된 배열 사이의 차이 찾기

data = np.zeros(t_len, dtype={'names':['date', 'symbol'], 'formats':['i8', 'S16']}) 
data[:] = [(x['date'], x['symbol']) for x in tbl.iterrows()] 
data.sort(order=['date', 'symbol']) 
data2 = np.unique(data) 
duplicates = False 

if len(data) != len(data2): 
    duplicates = True 
    print "There are duplicates" 

if not duplicates: 
    print "No duplicates found" 

을 자, 중복을 포함하는 색인을 결정하는 것이 정말로하고 싶습니다. 예를 들어, 경우에게 내가 포함 된 데이터 집합했다 :

array([12322323,'IBM'], [12322323,'IBM'], [12322323,'MSFT'], [12322323,'IBM']) 

내가 배열 배열 참조 알고 싶습니다 ([12322323를, 'IBM'은])

나는 독특하고 차이 사용을 검토 한 결과 기능을하지만, 그 일을하지 않는 것 같습니다.

답변

2

이 단순화하기 위해, 난 그냥 입력으로, 정수, x의 배열을 사용합니다 : 나중에

>>> x = np.array([20, 10, 30, 10, 60, 30, 10]) 

NumPy와 버전 1.9.0 또는, 우리는 함께 독특한 요소를 얻을 수 np.unique을 사용할 수 있습니다 각각의 고유 한 요소의 발생 횟수는 NumPy와 이전 버전의

>>> u, counts = np.unique(x, return_counts=True) 

반환 될 수 있도록 인수 return_counts=True, 하나는을 사용할 수 있습니다

>>> counts = np.bincount(inv) 
>>> counts 
array([3, 1, 2, 1]) 

: 이제 각 요소의 발생 수를 계산하는 bincount를 사용

>>> u, inv = np.unique(x, return_inverse=True) 
>>> u 
array([10, 20, 30, 60]) 
>>> inv 
array([1, 0, 2, 0, 3, 2, 0]) 

: 인수 return_inverse=True와도 독특한 요소의 배열에서 x을 재현하는 방법을 보여줍니다 배열을 얻을 수 있습니다

그래서 이제 우리는 counts을 가지며, 배열에서 각 요소가 몇 번 발생했는지 알려줍니다.

>>> dups = u[counts > 1] 
>>> dups 
array([10, 30]) 
+0

는 구조화 된 어레이의 경우, 다음 재귀 적으로 다른 필드를 확인, 새로운 구조화 된 배열을 얻을 수있는 첫 번째 필드에이 방법을 사용 : 우리는 다음과 같이 중복을 가지고있는 요소를 당겨 수 있습니다. –

+0

그것은 쉬웠다! 감사. –

+0

실제로 np.unique에 return_counts 인수가있는 것 같습니다. 따라서 bincount 할 필요가 없습니다. – ntg