[PYTHON] NumPy는 인덱스 목록을 사용하여 행당 특정 열 인덱스를 선택합니다.
PYTHONNumPy는 인덱스 목록을 사용하여 행당 특정 열 인덱스를 선택합니다.
NumPy 행렬의 행당 특정 열을 선택하는 데 어려움을 겪고 있습니다.
내가 X라고 부르는 다음의 행렬을 가지고 있다고 가정 해보자.
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
또한 Y라고하는 모든 행마다 열 인덱스 목록이 있습니다.
[1, 0, 2]
나는 값을 얻을 필요가있다 :
[2]
[4]
[9]
인덱스 Y가있는 목록 대신 X와 동일한 모양의 행렬을 생성 할 수 있습니다. 여기서 모든 열은 필수 열인지 여부를 나타내는 0-1 값 범위의 bool / int입니다.
[0, 1, 0]
[1, 0, 0]
[0, 0, 1]
배열을 반복하고 필요한 열 값을 선택하면이 작업을 수행 할 수 있습니다. 그러나이 작업은 대규모 데이터 배열에서 자주 실행되므로 가능한 한 빨리 실행해야합니다.
따라서 더 나은 솔루션이 있는지 궁금합니다.
고맙습니다.
해결법
-
==============================
1.boolean 배열을 가지고 있다면 다음과 같이 직접 선택을 할 수 있습니다 :
boolean 배열을 가지고 있다면 다음과 같이 직접 선택을 할 수 있습니다 :
>>> a = np.array([True, True, True, False, False]) >>> b = np.array([1,2,3,4,5]) >>> b[a] array([1, 2, 3])
당신의 초기 예제를 따라 가려면 다음을 할 수 있습니다 :
>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]]) >>> b = np.array([[False,True,False],[True,False,False],[False,False,True]]) >>> a[b] array([2, 4, 9])
또한 범위를 추가하고 직접 선택을 수행 할 수 있습니다.하지만 부울 배열을 생성하는 방법과 코드가 YMMV처럼 보이는 지에 따라 다릅니다.
>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]]) >>> a[np.arange(len(a)), [1,0,2]] array([2, 4, 9])
도움이되기를 바랍니다. 질문이 있으시면 알려주세요.
-
==============================
2.다음과 같이 할 수 있습니다.
다음과 같이 할 수 있습니다.
In [7]: a = np.array([[1, 2, 3], ...: [4, 5, 6], ...: [7, 8, 9]]) In [8]: lst = [1, 0, 2] In [9]: a[np.arange(len(a)), lst] Out[9]: array([2, 4, 9])
다차원 배열 인덱싱에 대한 자세한 내용 : http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi- dimensional-arrays
-
==============================
3.iterator를 사용하여 수행 할 수 있습니다. 이렇게 :
iterator를 사용하여 수행 할 수 있습니다. 이렇게 :
np.fromiter((row[index] for row, index in zip(X, Y)), dtype=int)
시각:
N = 1000 X = np.zeros(shape=(N, N)) Y = np.arange(N) #@Aशwini चhaudhary %timeit X[np.arange(len(X)), Y] 10000 loops, best of 3: 30.7 us per loop #mine %timeit np.fromiter((row[index] for row, index in zip(X, Y)), dtype=int) 1000 loops, best of 3: 1.15 ms per loop #mine %timeit np.diag(X.T[Y]) 10 loops, best of 3: 20.8 ms per loop
-
==============================
4.순수 numpythonic 접근 방식으로 np.take ()를 사용하여 두 번째 축의 인덱스를 얻을 수 있습니다. 그러면 결과의 대각선이 예상 출력이됩니다.
순수 numpythonic 접근 방식으로 np.take ()를 사용하여 두 번째 축의 인덱스를 얻을 수 있습니다. 그러면 결과의 대각선이 예상 출력이됩니다.
np.diagonal(np.take(arr, idx, axis=1))
데모:
>>> arr = np.array([[1, 2, 3], ... [4, 5, 6], ... [7, 8, 9]]) >>> >>> idx = [1, 0, 2] >>> >>> np.diagonal(np.take(arr, idx, axis=1)) array([2, 4, 9])
-
==============================
5.또 다른 영리한 방법은 먼저 배열을 조 변경하고 그 이후 색인을 만드는 것입니다. 마지막으로 대각선을 택하십시오. 항상 올바른 대답입니다.
또 다른 영리한 방법은 먼저 배열을 조 변경하고 그 이후 색인을 만드는 것입니다. 마지막으로 대각선을 택하십시오. 항상 올바른 대답입니다.
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) Y = np.array([1, 0, 2, 2]) np.diag(X.T[Y])
단계별 :
원본 배열 :
>>> X array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]]) >>> Y array([1, 0, 2, 2])
Transpose를 사용하여 오른쪽으로 색인 할 수 있습니다.
>>> X.T array([[ 1, 4, 7, 10], [ 2, 5, 8, 11], [ 3, 6, 9, 12]])
Y 순서로 행을 가져옵니다.
>>> X.T[Y] array([[ 2, 5, 8, 11], [ 1, 4, 7, 10], [ 3, 6, 9, 12], [ 3, 6, 9, 12]])
대각선은 이제 분명해질 것입니다.
>>> np.diag(X.T[Y]) array([ 2, 4, 9, 12]
-
==============================
6.간단한 방법은 다음과 같습니다.
간단한 방법은 다음과 같습니다.
In [1]: a = np.array([[1, 2, 3], ...: [4, 5, 6], ...: [7, 8, 9]]) In [2]: y = [1, 0, 2] #list of indices we want to select from matrix 'a'
range (a.shape [0])는 array ([0, 1, 2])를 반환합니다.
In [3]: a[range(a.shape[0]), lst] #we're selecting lst indices from every row Out[3]: array([2, 4, 9])
from https://stackoverflow.com/questions/23435782/numpy-selecting-specific-column-index-per-row-by-using-a-list-of-indexes by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 팬더가 목록을 셀에 삽입합니다. (0) | 2018.10.12 |
---|---|
[PYTHON] Shebang Notation : Windows와 Linux상의 Python 스크립트? (0) | 2018.10.12 |
[PYTHON] '파이썬'이 내부 또는 외부 명령으로 인식되지 않습니다. (0) | 2018.10.12 |
[PYTHON] Django : ImproperlyConfigured : SECRET_KEY 설정을 비워서는 안됩니다. (0) | 2018.10.12 |
[PYTHON] 유니 코드 입력을 읽고 파이썬에서 유니 코드 문자열을 비교하는 방법? (0) | 2018.10.12 |