[PYTHON] 2 차원 질의 배열로 일치하는 행 찾기
PYTHON2 차원 질의 배열로 일치하는 행 찾기
행과 일치하는 2 차원 Numpy 배열의 인덱스를 얻고 싶습니다. 예를 들어, 내 배열은 다음과 같습니다.
vals = np.array([[0, 0],
[1, 0],
[2, 0],
[0, 1],
[1, 1],
[2, 1],
[0, 2],
[1, 2],
[2, 2],
[0, 3],
[1, 3],
[2, 3],
[0, 0],
[1, 0],
[2, 0],
[0, 1],
[1, 1],
[2, 1],
[0, 2],
[1, 2],
[2, 2],
[0, 3],
[1, 3],
[2, 3]])
인덱스 3과 15 인 행 [0, 1]과 일치하는 인덱스를 얻고 싶습니다. numpy.where (vals == [0, 1])와 같은 작업을 수행 할 때 ...
(array([ 0, 3, 3, 4, 5, 6, 9, 12, 15, 15, 16, 17, 18, 21]), array([0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0]))
인덱스 배열이 필요합니다 ([3, 15]).
해결법
-
==============================
1.인덱스를 얻으려면 np.where 함수가 필요합니다.
인덱스를 얻으려면 np.where 함수가 필요합니다.
>>> np.where((vals == (0, 1)).all(axis=1)) (array([ 3, 15]),)
또는 설명서에 명시된 바와 같이 :
.allon에 의해 반환 된 배열에서 직접 .nonzero ()를 호출 할 수 있습니다.
>>> (vals == (0, 1)).all(axis=1).nonzero() (array([ 3, 15]),)
그것을 분해하려면 :
>>> vals == (0, 1) array([[ True, False], [False, False], ... [ True, False], [False, False], [False, False]], dtype=bool)
그 배열 (axis = 1)에서 .all 메서드를 호출하면 True를 얻을 수 있습니다.
>>> (vals == (0, 1)).all(axis=1) array([False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False], dtype=bool)
그리고 어떤 인덱스가 참인지를 얻으려면 :
>>> np.where((vals == (0, 1)).all(axis=1)) (array([ 3, 15]),)
또는
>>> (vals == (0, 1)).all(axis=1).nonzero() (array([ 3, 15]),)
내 솔루션을 좀 더 읽기 쉽지만, unutbu가 지적한 것처럼 다음은 더 빠를 수 있고 vals == (0, 1)과 같은 값을 반환합니다. 모두 (축 = 1) :
>>> (vals[:, 0] == 0) & (vals[:, 1] == 1)
-
==============================
2.
In [5]: np.where((vals[:,0] == 0) & (vals[:,1]==1))[0] Out[5]: array([ 3, 15])
왜 그런지 잘 모르겠지만 이것은 np.where ((vals == (0, 1)). 모두 (축 = 1)) :
In [34]: vals2 = np.tile(vals, (1000,1)) In [35]: %timeit np.where((vals2 == (0, 1)).all(axis=1))[0] 1000 loops, best of 3: 808 µs per loop In [36]: %timeit np.where((vals2[:,0] == 0) & (vals2[:,1]==1))[0] 10000 loops, best of 3: 152 µs per loop
-
==============================
3.numpy_indexed 패키지를 사용하면 다음과 같이 간단하게 작성할 수 있습니다.
numpy_indexed 패키지를 사용하면 다음과 같이 간단하게 작성할 수 있습니다.
import numpy_indexed as npi print(np.flatnonzero(npi.contains([[0, 1]], vals)))
from https://stackoverflow.com/questions/25823608/find-matching-rows-in-2-dimensional-numpy-array by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서리스트에서 가장 짧은 문자열 찾기 (0) | 2018.11.21 |
---|---|
[PYTHON] 파이썬에서 '\ x'가 왜 유효하지 않습니까? (0) | 2018.11.21 |
[PYTHON] urllib.open을 사용할 때의 파이썬 오류 (0) | 2018.11.21 |
[PYTHON] Pika의 대기열 크기 가져 오기 (AMQP Python) (0) | 2018.11.21 |
[PYTHON] Django 템플릿에서 변수를 사용하여 dict에 액세스하고 있습니까? (0) | 2018.11.21 |