programing tip

차원 정보 손실없이 Numpy 인덱스 슬라이스

itbloger 2020. 10. 12. 07:19
반응형

차원 정보 손실없이 Numpy 인덱스 슬라이스


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에 비슷한 것이 있습니까? 나는 문서에서 그것을 찾을 수 없었고 비슷한 질문이 요구되는 것을 보지 못했습니다.

감사!


아마도 가장 쉬운 방법 x[None, 10, :]이거나 동등하게 (하지만 더 읽기 쉽습니다 ) x[np.newaxis, 10, :].

왜 이것이 기본값이 아닌지에 관해서는 개인적으로 단일 차원의 배열을 지속적으로 사용하는 것이 매우 빠르게 성가신다는 것을 알았습니다. 나는 numpy 개발자가 같은 느낌을 받았다고 생각합니다.

또한 numpy는 브로드 캐스팅 배열을 매우 잘 처리하므로 일반적으로 슬라이스가 나온 배열의 차원을 유지할 이유가 거의 없습니다. 그랬다면 다음과 같은 것들이 있습니다.

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

작동하지 않거나 구현하기가 훨씬 더 어려울 것입니다.

(또는 적어도 슬라이스 할 때 차원 정보를 삭제하는 뒤에있는 numpy dev의 추론에 대한 내 추측입니다)


또 다른 해결책은

X[[10],:]

또는

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

인덱스 목록 (또는 배열)에 의해 인덱싱이 수행 될 때 배열의 차원 성이 유지됩니다. 치수를 유지하는 것과 짜내는 것 중에서 선택할 수 있기 때문에 좋습니다.


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

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

2)이 이상한 인덱싱 사용 X[10:11:, :]

이상적으로는 이것이 기본값이어야합니다. 왜 차원이 떨어지는 지 이해하지 못했습니다. 그러나 그것은 numpy에 대한 토론입니다 ...


내가 더 좋아하는 대안이 있습니다. 단일 숫자로 인덱싱하는 대신 범위로 인덱싱하십시오. 즉, X[10:11,:]. ( 10:1111은 포함되지 않음).

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

이를 통해 더 많은 차원으로도 쉽게 이해할 None수 있으며 어떤 인덱스를 사용할 축을 알아낼 필요도 없습니다 . 또한 더 그냥 배열 크기에 따라 추가 부기를 할 필요가 없습니다 i:i+1어떤을 위해 i당신이 정기적으로 인덱싱에 사용했을 것이라고.

b = np.ones((2, 3, 4))
b.shape # >> (2, 3, 4)
b[1:2,:,:].shape  # >> (1, 3, 4)
b[:, 2:3, :].shape .  # >> (2, 1, 4)

gnebehay에 의한 목록 또는 배열에 의한 인덱싱과 관련된 솔루션에 추가하려면 튜플을 사용할 수도 있습니다.

X[(10,),:]

런타임에 길이가 1 일 수있는 배열로 인덱싱하는 경우 특히 짜증이납니다. 이 경우 다음이 있습니다 np.ix_.

some_array[np.ix_(row_index,column_index)]

참고 URL : https://stackoverflow.com/questions/3551242/numpy-index-slice-without-losing-dimension-information

반응형