복붙노트

[PYTHON] 2 개의 색인 목록을 가진 2D Numpy 배열의 색인 생성

PYTHON

2 개의 색인 목록을 가진 2D Numpy 배열의 색인 생성

나는 이상한 상황에 처해있다.

나는 2D Numpy 배열을 가지고있다. x :

x = np.random.random_integers(0,5,(20,8))

그리고 두 개의 인덱서가 있습니다 - 하나는 행에 대한 인덱스이고 다른 하나는 인덱스에 대한 인덱스입니다. X를 색인화하려면 다음을 수행해야합니다.

row_indices = [4,2,18,16,7,19,4]
col_indices = [1,2]
x_rows = x[row_indices,:]
x_indexed = x_rows[:,column_indices]

대신에 :

x_new = x[row_indices,column_indices]

(오류와 함께 실패 : (2,)와 함께 브로드 캐스트 (20) 할 수 없음)

방송을 사용하여 한 줄로 색인을 생성 할 수 있기를 원합니다. 코드를 깨끗하고 읽기 쉽게 유지할 수 있기 때문입니다 ... 또한 파이썬에 대한 내용은 잘 모르지만 이해합니다. 그것은 한 줄로 처리하는 것이 더 빠를 것입니다. (꽤 큰 배열로 작업 할 것입니다).

테스트 케이스 :

x = np.random.random_integers(0,5,(20,8))

row_indices = [4,2,18,16,7,19,4]
col_indices = [1,2]
x_rows = x[row_indices,:]
x_indexed = x_rows[:,col_indices]

x_doesnt_work = x[row_indices,col_indices]

해결법

  1. ==============================

    1.그러한 방송 작업에 np.ix_를 사용하면됩니다.

    그러한 방송 작업에 np.ix_를 사용하면됩니다.

    x_indexed = x[np.ix_(row_indices,col_indices)]
    

    샘플 실행 -

    In [221]: x
    Out[221]: 
    array([[17, 39, 88, 14, 73, 58, 17, 78],
           [88, 92, 46, 67, 44, 81, 17, 67],
           [31, 70, 47, 90, 52, 15, 24, 22],
           [19, 59, 98, 19, 52, 95, 88, 65],
           [85, 76, 56, 72, 43, 79, 53, 37],
           [74, 46, 95, 27, 81, 97, 93, 69],
           [49, 46, 12, 83, 15, 63, 20, 79]])
    
    In [222]: row_indices
    Out[222]: [4, 2, 5, 4, 1]
    
    In [223]: col_indices
    Out[223]: [1, 2]
    
    In [224]: np.ix_(row_indices,col_indices) # Broadcasting of indices
    Out[224]: 
    (array([[4],
            [2],
            [5],
            [4],
            [1]]), array([[1, 2]]))
    
    In [225]: x[np.ix_(row_indices,col_indices)]
    Out[225]: 
    array([[76, 56],
           [70, 47],
           [46, 95],
           [76, 56],
           [92, 46]])
    

    OP에서 제안했듯이 이는 axis = 0으로 전송 된 요소 / 색인을 가진 row_indices의 2D 배열 버전으로 구 학교 방송을 수행하는 것과 동일하므로 축 = 1에서 싱글 톤 차원을 작성하므로 col_indices로 브로드 캐스팅 할 수 있습니다 . 따라서 우리는 대체 솔루션을 갖게 될 것입니다 -

    In [227]: x[np.array(row_indices)[:,None],col_indices]
    Out[227]: 
    array([[76, 56],
           [70, 47],
           [46, 95],
           [76, 56],
           [92, 46]])
    
  2. ==============================

    2.

    import numpy as np
    x = np.random.random_integers(0,5,(4,4))
    x
    array([[5, 3, 3, 2],
           [4, 3, 0, 0],
           [1, 4, 5, 3],
           [0, 4, 3, 4]])
    
    # This indexes the elements 1,1 and 2,2 and 3,3
    indexes = (np.array([1,2,3]),np.array([1,2,3]))
    x[indexes]
    # returns array([3, 5, 4])
    

    numpy는 사용하는 색인의 종류에 따라 매우 다른 규칙을가집니다. 따라서 여러 요소를 인덱싱하려면 np.ndarray 튜플을 사용해야합니다 (인덱싱 매뉴얼 참조).

    따라서 목록을 np.ndarray로 변환하기 만하면 예상대로 작동합니다.

  3. ==============================

    3.는 어때:

    는 어때:

    x[row_indices][:,col_indices]
    

    예를 들어,

    x = np.random.random_integers(0,5,(5,5))
    ## array([[4, 3, 2, 5, 0],
    ##        [0, 3, 1, 4, 2],
    ##        [4, 2, 0, 0, 3],
    ##        [4, 5, 5, 5, 0],
    ##        [1, 1, 5, 0, 2]])
    
    row_indices = [4,2]
    col_indices = [1,2]
    x[row_indices][:,col_indices]
    ## array([[1, 5],
    ##        [2, 0]])
    
  4. ==============================

    4.나는 다음과 같은 (평등 한) 작업 중 하나를 시도하고 있다고 생각한다.

    나는 다음과 같은 (평등 한) 작업 중 하나를 시도하고 있다고 생각한다.

    x_does_work = x[row_indices,:][:,col_indices]
    x_does_work = x[:,col_indices][row_indices,:]
    

    이것은 실제로 선택한 행만 가진 x의 하위 집합을 만든 다음 두 번째 경우에서 그 열을 선택하거나 그 반대의 경우도 마찬가지입니다. 첫 번째 경우는 다음과 같이 생각할 수 있습니다.

    x_does_work = (x[row_indices,:])[:,col_indices]
    
  5. from https://stackoverflow.com/questions/35607818/index-a-2d-numpy-array-with-2-lists-of-indices by cc-by-sa and MIT license