나는 np.where와 문자열을 포함하는 배열의 항목을 찾기 위해 노력하고 조건에 :numpy 배열에 부분 문자열을 포함하는 항목을 찾으십니까?
import numpy as np
foo = "aa"
bar = np.array(["aaa", "aab", "aca"])
np.where(foo in bar)
이는 하늘의 배열을 돌려줍니다.
왜 그렇습니까?
좋은 대안 솔루션이 있습니까?
나는 np.where와 문자열을 포함하는 배열의 항목을 찾기 위해 노력하고 조건에 :numpy 배열에 부분 문자열을 포함하는 항목을 찾으십니까?
import numpy as np
foo = "aa"
bar = np.array(["aaa", "aab", "aca"])
np.where(foo in bar)
이는 하늘의 배열을 돌려줍니다.
왜 그렇습니까?
좋은 대안 솔루션이 있습니까?
당신이 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]
우리는 발견되지 않는 경우는 -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])
봐는 : 배열을 사용하는 경우
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
버전에서 작동하는 것이 좋습니다 - 즉, 아무튼 셰이프 ' 그것의 행동에 영향을 미친다.
완벽하게 작동합니다. 고마워요! 그러나 호기심에서 당신은 왜 np.where가 작동하지 않는지 알 수 있습니까? – SiOx
@SiOx NumPy 배열 인 AFAIK'foo'는'in'과 함께 작동하지 않습니다. 그 in은 파이썬리스트 등을 의미합니다. – Divakar
'in'은 배열과 함께 작동합니다. 즉,'ndarray'는'__contains__' 메소드를 가지고 있습니다. 그러나 행동은 목록의 행동과 비슷합니다. – hpaulj