2016-08-16 5 views

답변

0

당신이 np.where을 사용하려고하는 방법은 올바르지 않습니다. np.where의 첫 번째 인수는 부울 배열이어야하며 부울 값을 전달하기 만하면됩니다.

foo in bar 
>>> False 
np.where(False) 
>>> (array([], dtype=int32),) 
np.where(np.array([True, True, False])) 
>>> (array([0, 1], dtype=int32),) 

문제가 element-wise boolean operation NumPy와 같이 in 연산자를 정의하지 않는다는 것이다.

원하는 것을 달성 할 수있는 한 가지 방법은 목록 이해입니다. in를 사용하는 몇 가지 예를

foo = 'aa' 
bar = np.array(['aaa', 'aab', 'aca']) 
out = [i for i, v in enumerate(bar) if foo in v] 
# out = [0, 1] 

bar = ['aca', 'bba', 'baa', 'aaf', 'ccc'] 
out = [i for i, v in enumerate(bar) if foo in v] 
# out = [2, 3] 
5

우리는 발견되지 않는 경우는 -1을 반환 bar의 각 요소에 foo 문자열의 위치를 ​​찾을 np.core.defchararray.find를 사용할 수 있습니다. 따라서 foo이 각 요소에 있는지 여부를 확인하는 데 사용할 수 있으며 find의 출력에서 ​​-1을 확인합니다. 마지막으로 np.flatnonzero을 사용하여 일치 항목의 색인을 얻습니다. 그래서 우리는 지금처럼 구현을 할 것이다 -

np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1) 

샘플 실행 -

In [91]: bar 
Out[91]: 
array(['aaa', 'aab', 'aca'], 
     dtype='|S3') 

In [92]: foo 
Out[92]: 'aa' 

In [93]: np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1) 
Out[93]: array([0, 1]) 

In [94]: bar[2] = 'jaa' 

In [95]: np.flatnonzero(np.core.defchararray.find(bar,foo)!=-1) 
Out[95]: array([0, 1, 2]) 
+0

완벽하게 작동합니다. 고마워요! 그러나 호기심에서 당신은 왜 np.where가 작동하지 않는지 알 수 있습니까? – SiOx

+0

@SiOx NumPy 배열 인 AFAIK'foo'는'in'과 함께 작동하지 않습니다. 그 in은 파이썬리스트 등을 의미합니다. – Divakar

+0

'in'은 배열과 함께 작동합니다. 즉,'ndarray'는'__contains__' 메소드를 가지고 있습니다. 그러나 행동은 목록의 행동과 비슷합니다. – hpaulj

0

봐는 : 배열을 사용하는 경우

In [19]: bar = np.array(["aaa", "aab", "aca"]) 

In [20]: 'aa' in bar 
Out[20]: False 

In [21]: 'aaa' in bar 
Out[21]: True 

In [22]: 'aab' in bar 
Out[22]: True 

In [23]: 'aab' in list(bar) 

이 배열 목록이었다 것처럼 작동 in 것 같습니다. ndarray에는 __contains__ 방법이 있으므로 in이 작동하지만 간단 할 수 있습니다.

그러나 어쨌든 in alist은 부분 문자열을 확인하지 않습니다. strings__contains__은 하위 문자열 테스트를 수행하지만 테스트를 구성 요소 문자열로 전파하는 기본 제공 클래스를 알지 못합니다.

마찬가지로 Divakar에는 배열의 개별 요소에 문자열 메서드를 적용하는 numpy 함수 모음이 있습니다.

In [42]: np.char.find(bar, 'aa') 
Out[42]: array([ 0, 0, -1]) 

참조 문 :
이 모듈은 벡터화 문자열 동작 및 방법을위한 일련의 기능을 포함한다. defchararray의 기본 별칭은 numpy.char입니다.작업의 경우

는 다음과 같이 나는 np.char 속도가와로 거의 같은 생각 :

In [49]: np.frompyfunc(lambda x: x.find('aa'), 1, 1)(bar) 
Out[49]: array([0, 0, -1], dtype=object) 

In [50]: np.frompyfunc(lambda x: 'aa' in x, 1, 1)(bar) 
Out[50]: array([True, True, False], dtype=object) 

또한 테스트는 ndarray__contains__ 배열의 flat 버전에서 작동하는 것이 좋습니다 - 즉, 아무튼 셰이프 ' 그것의 행동에 영향을 미친다.