복붙노트

[PYTHON] 2 차원 질의 배열로 일치하는 행 찾기

PYTHON

2 차원 질의 배열로 일치하는 행 찾기

행과 일치하는 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. ==============================

    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. ==============================

    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. ==============================

    3.numpy_indexed 패키지를 사용하면 다음과 같이 간단하게 작성할 수 있습니다.

    numpy_indexed 패키지를 사용하면 다음과 같이 간단하게 작성할 수 있습니다.

    import numpy_indexed as npi
    print(np.flatnonzero(npi.contains([[0, 1]], vals)))
    
  4. from https://stackoverflow.com/questions/25823608/find-matching-rows-in-2-dimensional-numpy-array by cc-by-sa and MIT license