2017-02-24 7 views
1

두 배열 inputlabel이 있습니다. 각 배열의 크기는 3x2x2x2이고 3 개의 요소는 2x2x2 행렬입니다. 배열 label 일부 요소 (내 벨로우 코드에서 =2) 0 값이 있습니다. 배열을 삭제하거나 제거하려고합니다. label 배열. 또한 input 배열의 요소를 삭제하려면 label 배열의 삭제 된 인덱스에 해당하는 요소를 삭제하고 싶습니다. 파이썬으로 어떻게 할 수 있습니까? 마스크와 감사3D 매트릭스에서 제로 요소를 삭제하는 방법은 무엇입니까?

import numpy as np 
input=np.arange(3*2*2*2).reshape(3,2,2,2) 
label=np.arange(3*2*2*2).reshape(3,2,2,2) 
# Assign value 
label[0]=0 
label[2]=0 
print input 
print label 
#Delete element 
for i in range(label.shape[0]): 
    if(np.sum(label[i])==0): 
     print i 
     #del label[i, :, :, :] 
#Expected result: non-zero element are label[1] and input[1] 
+0

numpy 배열이 목적에 맞는 최상의 데이터 구조라고 생각하지 않습니다. 'numpy.ndarray' 객체는 임의의 삽입이나 삭제가 아닌 랜덤 액세스를 위해 메모리 블록에 저장되는 균일 한 유형 및 크기의 객체라는 의미에서 "배열"을 모델로합니다. 당신이 할 수있는 일은 "특별한"위치에 대한 별도의 색인을 유지하고 나중에 사용하기 위해 건너 뛴다는 것입니다. –

답변

1

한 가지 방법 -

mask = ~(label == 0).all(axis=(1,2,3)) # or (label != 0).any(axis=(1,2,3)) 
new_label = label[mask] 
new_input = input[mask] 

나는 새로운 출력 배열 등이 label[mask]input[mask]를 출력하고, 그냥 /이 배열은 입력 배열에 새로운 배열과 뷰가 아닌 것이 나타 보여 . 엄밀히 말하면 배열에서 요소를 삭제하는 것은 불가능하지만 재 할당합니다. 그래서, 우리는 같은의 재 할당 부분을 수행 할 수 있습니다 -

label = label[mask] 
input = input[mask] 

에게 또 다른 방법은 첫 번째 축을 따라 그 지표를 발견하고 np.delete 사용하여 - 다시

idx = np.flatnonzero((label == 0).all((1,2,3))) 
new_label = np.delete(label, idx, axis=0) 
new_input = np.delete(input, idx, axis=0) 

을, 우리는 실제로 아니다 요소를 삭제하지만, 이전에 논의 된대로 다시 할당 할 수있는 새로운 사본을 만드는 것.

+0

완벽한 솔루션. '모두 (1,2,3) '란 무엇입니까? – user3051460

+0

그리고'new_label' 대신에'label = label [mask]'를 사용하십시오. 안전하지 않니? – user3051460

+0

@ user3051460 편집 내용이 올바른지 확인하십시오. – Divakar

관련 문제