2013-08-03 1 views
3

는 :NumPy, 개체 배열에 대한 동등 검사가 작동하지 않는 이유는 무엇입니까? 객체의 다음과 같은 배열로

a = np.array([[1], [1, 2], [1, 2, 3], [1], [1]], dtype=object) 
b = np.array([(1,), (1, 2), (1, 2, 3), (1,), (1,)], dtype=object) 

다음 평등 검사가 작동하지 않습니다 :

a==[1] 
#array([False, False, False, False, False], dtype=bool) 

b==(1,) 
#array([False, False, False, False, False], dtype=bool) 

내가 대신 문자열을 사용하는 경우 :

c = np.array(['[1]', '[1, 2]', '[1, 2, 3]', '[1]', '[1]']) 

동등 검사가 작동합니다

c == '[1]' 
#array([ True, False, False, True, True], dtype=bool) 

배열 검사가 왜 그렇게 행동합니까?

[i==[1] for i in a] 
#[True, False, False, True, True] 

[i==(1,) for i in b] 
#[True, False, False, True, True] 

감사합니다 : 우리가 A 또는 B를 반복하고 또한 예상 된 결과를 제공 검사를 수행하는 경우

!

답변

5

NumPy는 많은 경우에 배열과 같은 객체를 배열로 자동 처리하도록 설계되었습니다. 여기서 NumPy는 [1](1,)이 배열과 유사한 객체이며 broadcasting 규칙을 적용한다고 봅니다. 한 변의 길이 -1 축은 다른 객체의 해당 축의 길이로 확장되고 한 객체의 치수가 다른 객체보다 작 으면 누락 된 치수가 왼쪽에 채워지고 다른 치수는 해당 객체의 길이로 채워집니다. 따라서

a == [1] 

False 5 개의 배열은

a == numpy.array([1, 1, 1, 1, 1]) 

와 동일한 결과를 제공한다.

+1

감사합니다. ' '[1] 요소와 비교하여 방송 규칙을 피하는 방법을 알고 계십니까? –

+0

아니요. 나의 조언은 배열 (또는 배열)을 배열 요소로 사용하는 것을 피하는 것이다. 일종의 명확히 목록이 아닌 객체로 래핑을 시도하거나 [마스크 배열] (http://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html)이 귀하의 유스 케이스. – user2357112

+0

빈 모양 -'()'배열을 만든 다음'[1]'목록으로 채울 수 있습니다. 'c = np.empty ([], dtype = object); c [()] = [1]'. 따라서 목록을 자체 배열로 해석하려는 자동 시도를 피할 수 있습니다. 'a'와'c'를 비교하면 결과가 나옵니다. –