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:11
11은 포함되지 않음).
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)]