2010-01-21 5 views
6

numpy 배열의 각 행에 대해 특정 열 요소를 선택하려고합니다. 예를 들어, 다음 실시 예에서 :배열에서 각 행의 특정 열 선택

In [1]: a = np.random.random((3,2)) 
Out[1]: 
array([[ 0.75670668, 0.1283942 ], 
     [ 0.51326555, 0.59378083], 
     [ 0.03219789, 0.53612603]]) 

I는 첫 번째 행의 첫 번째 요소는 두 번째 행의 두 번째 요소, 세번째 행의 첫번째 요소를 선택하고 싶다. 그래서 나는 다음을 수행하려고 :

In [2]: b = np.array([0,1,0]) 

In [3]: a[:,b] 

을하지만 이것은 다음과 같은 출력을 생성합니다

Out[3]: 
array([[ 0.75670668, 0.1283942 , 0.75670668], 
     [ 0.51326555, 0.59378083, 0.51326555], 
     [ 0.03219789, 0.53612603, 0.03219789]]) 

을 명확하게 내가 찾던하지 않은. 루프를 사용하지 않고 내가하고 싶은 것을 쉽게 할 수 있습니까?

답변

8

당신은 사용할 수 있습니다

a[np.arange(3), (0,1,0)] 

당신의 예에서 위.

+0

실제로. * 슬라이싱 (Slicing) *은 주어진 축을 그대로 유지하지만, 두 차원에서 원했던 것을 문서에서 * 멋진 색인 생성 *이라고합니다. – dwf

+0

오른쪽. 예를 들어'a [0 : 2,0 : 2]'와'a [[0,1], [0,1]]'은 서로 다른 것을 반환합니다. –

2

이 점을 조금만 설명하려는 시도만큼 답이 아닙니다. 상기 응답을 위해, 우리는 것이다 :

>>> import numpy as np 
>>> A = np.array(range(6)) 
>>> A 
array([0, 1, 2, 3, 4, 5]) 
>>> A.shape = (3,2) 
>>> A 
array([[0, 1], 
     [2, 3], 
     [4, 5]]) 
>>> A[(0,1,2),(0,1,0)] 
array([0, 3, 4]) 

개별 열의 목록 (또는 튜플)을 지정하고 컬럼 좌표 fancy 목록 배열에게 허용한다. 주석의 첫 번째 예제는 처음에는 유사하지만 인덱스는 조각입니다. 그들은 전체 범위에서 연장하지 않으며, 모양 반환되는 배열의이 다른 :

>>> A[0:2,0:2] 
array([[0, 1], 
     [2, 3]]) 

주석에서 두 번째 예를 들어

>>> A[[0,1],[0,1]] 
array([0, 3]) 

그래서 그 조각을 보인다 그것들을 제외하고는 다르다. 그러나 인덱스를 구성하는 방법에 상관없이 튜플이나리스트 (x 값, y 값)를 지정하고 배열에서 특정 엘리먼트를 복구 할 수있다.

3
, 그냥 여기 명확히하기 위해,

A=diag(arange(0,10,1)) 

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 2, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 3, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 4, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 5, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 6, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 7, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 8, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 9]]) 

다음

A[0][0:4] 

array([0, 0, 0, 0]) 
012을 제공합니다 제공하는 간단한 예제를 어떻게 확인 할 수 있습니다

최초의 행 3,516,

요소 0~3 그러나

A[0:4][1] 

제 4 행에 각각 제 2 요소를 제공하지 않는다. 대신 우리는 얻을 수

array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0]) 

즉 전체 2 열.

A[0:4,1] 

내가 이것에 대한 아주 좋은 이유가 확신 프로그래머 에 완벽한 의미가 있지만 큰 종교 뱅크스 이러한 우리의 것이 매우 혼란 스러울 수있는

array([0, 1, 0, 0]) 

을 제공합니다 .

+0

[0 : 4]는 모양의 새 배열을 만듭니다 (4,10). A [0 : 4, y]를 사용하면 배열의 두 번째 차원을 요구하는 반면 A [0 : 4] [x]의 경우 새 배열의 첫 번째 차원을 요구합니다! 희미한 1 또는 희미한 2를 요구할 때 도움이되는 경우 A [0 : 4, :] [1 ,:]이라고 쓸 수 있습니다. – bendaizer

+0

diag를 사용하면 결국 자신과 다른 사람들이 혼란스럽게 만듭니다. 왜냐하면 실제로'A [ 0 : 4] [1]'두 번째 열이 아니라 두 번째 * 행을주었습니다. –

관련 문제