2010-08-23 2 views
45

numpy를 사용 중이며 치수 정보를 잃지 않고 행을 색인하려고합니다.치수 정보를 잃지 않는 탁아한 색인 조각

import numpy as np 
X = np.zeros((100,10)) 
X.shape  # >> (100, 10) 
xslice = X[10,:] 
xslice.shape # >> (10,) 

이 예제에서 xslice는 이제 1 차원이지만 (1,10)이 원합니다. R에서는 X [10, :, drop = F]를 사용합니다. numpy에서 비슷한 것이 있습니까? 나는 문서에서 그것을 찾을 수 없었고 유사한 질문을 보지 못했다.

감사합니다.

답변

29

x[None, 10, :] 또는 이와 동등하게 (그러나 더 읽기 쉬운) x[np.newaxis, 10, :]을하는 것이 가장 쉽습니다.

기본적으로 개인적인 이유가없는 한, 싱글 톤 차원의 배열을 지속적으로 사용하는 것은 매우 짜증이납니다. 나는 numpy devs가 같은 방식으로 느꼈다고 생각한다.

또한 numpy는 방송 배열을 잘 처리하므로 일반적으로 슬라이스가 생성 된 배열의 차원을 유지할 이유가 거의 없습니다. 당신이 한 경우, 상황이 좋아 :

a = np.zeros((100,100,10)) 
b = np.zeros(100,10) 
a[0,:,:] = b 

중 하나가 작동하지 않을 또는 훨씬 더 어려운 구현하는 것입니다.

가 (또는 적어도 그 슬라이스 차원 정보를 삭제 뒤에 NumPy와 데브의 논리에 내 추측)

+4

이것은 매우 잘못된 느낌입니다 ... – sebpiq

+1

사실,'x [10, :, None]'은'(1, 10)'이 아닌'(10,1)'모양의 배열을 반환합니다 .. – Lisa

+4

@Lisa :'x [아무도, 10]'당신이 원하는대로 할 것입니다. – naught101

13

몇 가지 합리적인 해결책을 찾았습니다.

1) numpy.take(X,[10],0)

2) 이상적이 이상한 색인 X[10:11:, :]

를 사용하여 사용이 기본이어야합니다. 왜 치수가 떨어지는 지 이해하지 못했습니다. 하지만 그것은 numpy에 대한 토론입니다.

+0

옵션 # 2는 꽤 굉장합니다. –

38

또 다른 해결책은

X[[10],:] 

또는

I = array([10]) 
X[I,:] 

의 차원을하는 것입니다 배열은 색인의 목록 (또는 배열)에 의해 색인이 수행 될 때 보존됩니다. 이것은 치수 유지와 압착 사이의 선택을 남겨주기 때문에 좋습니다.

+5

이것은 최고의 솔루션입니다. – Will

+1

배열 데이터를 복사합니다 – Per

+0

항상 그런 것은 아닙니다. 다음을 참조하십시오 :'x [n]. [[1,2,3,4]])' 'x [[0], [1,2]]'로 슬라이싱하면 1 차원 배열이됩니다. ([2, 3])'제 의견으로는 열 또는 행 벡터를 선택할 때 슬라이스를 단순하게 만들고'np.reshape'를 사용하는 것이 가장 좋습니다. 따라서 예제에서 np.reshape (x [0, [ 1,2]], [1,2])' – Alexander