[PYTHON] 2 개의 색인 목록을 가진 2D Numpy 배열의 색인 생성
PYTHON2 개의 색인 목록을 가진 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.그러한 방송 작업에 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.
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.는 어때:
는 어때:
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.나는 다음과 같은 (평등 한) 작업 중 하나를 시도하고 있다고 생각한다.
나는 다음과 같은 (평등 한) 작업 중 하나를 시도하고 있다고 생각한다.
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]
from https://stackoverflow.com/questions/35607818/index-a-2d-numpy-array-with-2-lists-of-indices by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] SQLAlchemy에서 튜플 대신 속성 목록 쿼리 (0) | 2018.10.05 |
---|---|
[PYTHON] 싱글 톤을 정의하는 간단하고 우아한 방법이 있습니까? [복제] (0) | 2018.10.05 |
[PYTHON] 파이썬 : 유효하지 않은 토큰 (0) | 2018.10.05 |
[PYTHON] 파이썬 목록 혼란 (0) | 2018.10.05 |
[PYTHON] 파이썬 목록 추가 동작 [duplicate] (0) | 2018.10.05 |