2014-03-26 3 views
1

나는 큰 2 차원 열도 배열 a 문자 (dtype = 'a1')를 가지고 동일한 문자를 포함하는 불변의 열을 찾고 싶습니다. 다음 코드는 작동하지만 아주 느립니다.numpy 배열에서 불변의 열을 확인하십시오.

var_col = np.zeros(a.shape[1], dtype='bool') 
for c in xrange(a.shape[1]): 
    if not all(a[:,c] == a[0,c]): 
     var_col[c] = True 

이 문제는 더 빠른 해결책이 있습니까? 감사합니다.

답변

2

== 연산자로 브로드 캐스트를 사용하는 한 가지 방법이 있습니다.

먼저 테스트 배열을 만듭니다.

In [27]: np.random.seed(1) 

In [28]: a = np.random.choice(list("AABC"), size=(3,9)) 

In [29]: a 
Out[29]: 
array([['A', 'C', 'A', 'A', 'C', 'A', 'C', 'A', 'C'], 
     ['A', 'A', 'A', 'A', 'C', 'A', 'A', 'B', 'A'], 
     ['B', 'A', 'B', 'A', 'B', 'A', 'C', 'A', 'B']], 
     dtype='|S1') 

각 요소를 해당 열의 맨 위에있는 요소와 비교하십시오. a[0]이 첫 번째 행입니다. 1d 배열입니다 (shape는 (9,) 임). 이와 같이 두 개의 배열을 가지고 ==을 사용할 때, a[0]은 첫 번째 행의 복사본으로 채워진 모양 (3,9)의 배열처럼 동작하는 "브로드 캐스트"입니다.

In [30]: a == a[0] 
Out[30]: 
array([[ True, True, True, True, True, True, True, True, True], 
     [ True, False, True, True, True, True, False, False, False], 
     [False, False, False, True, False, True, True, True, False]], dtype=bool) 

이제 비교 결과의 첫 번째 축을 따라 all을 사용하십시오.

In [31]: np.all(a == a[0], axis=0) 
Out[31]: array([False, False, False, True, False, True, False, False, False], dtype=bool) 
+0

위대한 '벡터화 된'솔루션! 그게 내가 찾던거야, 고마워! – huckleg

관련 문제