2017-05-02 1 views
-1

다중 분할 배열을 사용하여 별도의 차원을 따라 ndarray를 조각하려고 할 때 numpy 방송 오류의 원인을 이해하는 데 문제가 있습니다. 인덱스 배열 picks (예 : np.arange (2, 306, 3) 및 부울 배열 mask)을 사용하여 data ndarray (100, 306, 481)를 첫 번째 및 두 번째 차원으로 슬라이싱하려고합니다. 여기서 mask.shape은) 중 361 개의 요소는 True입니다.Numpy ndarray 배열로 조각 내기

data[:, picks, mask] 반환 그러나 data[:, :, mask]

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (102,) (361,)

, data[:, picks, :]data[:, :10, mask] 작업은 예상대로.

이 경우 방송은 어떻게 작동합니까? 그리고 이것을하는 비법의 방법은 무엇입니까? picks는 (361) 요소를 가지고

+0

당신이 원하는 경우 '(100, len (picks), len (mask))'형태의 조각이라면,'data [:, picks [:, np.newaxis], 마스크]'. '(m,)'와'(n,)'형태로 배열을 방송 할 수는 없지만'(m, 1)'및'(n,)'과 함께 할 수 있습니다. –

+0

또한'np.ix_' 함수를 검사 할 수도 있습니다. 위는'data [np.ix_ (arange (100), picks, mask)]'와 같습니다. –

답변

2

그래서

data[:, :, mask] => (100, 306, 361) 
data[:, :10, mask] => (100, 10, 361) 
data[:, picks, :] => (100, 102, 481) 

경우

data[:, picks, mask] => (100, 361) # I think :) 

그러나 별도 차원 색인 np.where(mask)picks 열에이어야 일치 picks 생각 벡터이므로, (102,1)은 (1, 361)로 방송하여 (102,361) 선택을 생성한다.

data[:, picks[:,None], mask] => (100, 102, 361) # again I need to test 

그래서 만드는 몇 가지 테스트 배열 :

In [253]: data=np.ones((100,306,481)) 
In [254]: picks=np.arange(2,306,3) 
In [255]: mask=np.zeros(481,bool) 
In [256]: mask[:361]=True 
In [257]: data[:, picks[:,None],mask].shape 
Out[257]: (100, 102, 361) 

arange에이

In [259]: data[:, 2::3, mask].shape 
Out[259]: (100, 102, 361) 

ix_이 경우에 편리 슬라이스로 대체 될 수

In [268]: I,J=np.ix_(picks,mask) 
In [269]: I.shape 
Out[269]: (102, 1) 
In [270]: J.shape 
Out[270]: (1, 361) 
In [271]: data[:,I,J].shape 
Out[271]: (100, 102, 361)