2014-04-07 3 views
1

두 개의 잠재적 인 큰 다차원 numpy.ndarrays의 차이를 설정해야합니다.
내 시험은 TypeError 다음 던지는없이 다차원 배열 일하기 numpy.setdiff1d을 확장하려고 실패 입증 :이 배열에다차원 ndarray 집합 연산

TypeError: Cannot change data-type for object array. 

데이터는 긴 문자열입니다.

나는 다음 두 배열이 있습니다

A = [[0L 'a'] 
    [2L 'c'] 
    [1L 'b'] 
    [3L 'b'] 
    [0L 'd']] 

B = [[1L 'b'] 
    [0L 'a'] 
    [4L 'b']] 

예상되는 결과는 집합 차이 쌍 ((0,d), (2,c), (3,b))S = A - B입니다.

답변

0

현재 파이썬의 설정 작업을 사용할 수 있습니다

In [66]: s = set(tuple(x) for x in A).difference(tuple(x) for x in B) 

In [67]: np.array(list(s)) 
Out[67]: 
array([['0', 'd'], 
     ['2', 'c'], 
     ['3', 'b']], 
     dtype='|S1') 
1

는 사용자가 설정 한 비교를 수행중인 따라 모양으로 한 구조화 된 배열을 사용하는 1D이다 (여기가, 당신은 효과적인 1D 배열이 있기 때문에) :

A = np.array([(0L, 'a'), 
       (2L, 'c'), 
       (1L, 'b'), 
       (3L, 'b'), 
       (0L, 'd')], dtype=[('n', long), ('l', 'S1')]) 

B = np.array([(1L, 'b'), 
       (0L, 'a'), 
       (4L, 'b')], dtype=[('n', long), ('l', 'S1')]) 

S = np.setdiff1d(A, B) 

>>> S 
array([(2L, 'c'), (3L, 'b'), (0L, 'd')], 
     dtype=[('n', '<i8'), ('l', 'S1')]) 
+0

올바른 방법으로 보이지만 언급 한 것처럼 dtype 배열을 변경할 수 없습니다. 내 np.arrays는 팬더 .values ​​() 메서드에서 반환됩니다. dtype은 객체입니다. .astype을 사용하여 제안 된 dtype로 변환하려고하는데 다음 유형 오류가 발생합니다 : 읽을 수있는 버퍼 객체가 필요합니다. 어떤 아이디어? – Zihs

+0

아, 때로는 특정 배열을 구조화 된 배열로 변환하는 것이 까다로울 수 있습니다. 'np.core.rec.fromarrays'를보십시오. 또한 판다 (pandas) 솔루션이있을 수 있으므로 numpy로 전환 할 필요가 없습니다. – askewchan