2012-11-30 6 views
2

배열에서 삭제와 관련하여 질문이 있습니다. 3-D numpy 배열 (좌표는 z, y, x)이고 예상 크기는 900^3입니다. 소수의 값만 0이 아니지만 중요한 공간 분포를 갖습니다. 해당 배열에 0 만있는 2 차원 슬라이스를 모두 삭제하고 싶습니다. 즉, 모든 관련 데이터가 들어있는 최소 크기의 배열이 필요합니다.Python Numpy Array에서 0 삭제하기

내 시도는 다음과 같습니다

while np.all(a[0]==0): 
     a=np.delete(a,0,0) 
    while np.all(a[a.shape[0]-1]==0) and a.shape[0]>1: 
     a=np.delete(a,-1,0) 

및 z 방향에 대해 작동하는 것 같다. 다른 두 방향에서 어떻게 평등을 할 수 있습니까? 그리고 그것을 더 잘 할 수있는 다른 방법이 있을까요?

또 다른 아이디어는

tmp=np.delete(tmp,np.all(tmp==0,axis=1),1) 

했지만 하나는 처음부터에만 작동하는 것 같다 그리고 마지막에 0을 밖으로 떠난다.

3D 공간에서 배열을 회전하는 것이 가능할까요?

for ax in range(3): 
    all_but_ax = [i for i in range(3) if i != ax] 
    a = delete(a, where(apply_over_axes(sum, abs(a), all_but_ax).ravel() == 0), 
        ax) 

:

+0

3d 공간에서 배열을 회전하려면 numpy.roll을 사용할 수 있습니다. – ebarr

답변

0

당신은 당신의 축을 다시 정렬 할 transpose을 사용할 수 있지만 정말 sparse array

+0

나는 이것이 무슨 뜻인지 잘 모르겠습니다. 스파 스 배열은 2D입니까? – Dschoni

+0

scipy에서 예 ... 좋은 지적입니다. 2D 문제를 가진 누군가를 도울 수 있기를 바랍니다. 사람들은 다차원 희소 배열을 구현했습니다. 예를 들어 다음과 같이 체크하면 이후의 포인트로 정확히 무엇을해야하는지에 따라 좋을 것입니다. http://www.janeriksolem.net/2010/02/sparray-sparse- n-dimensional-arrays-in.html. 그러나 코드가 z 방향으로 작동하는 경우 치수를 두 번 회전하여 프로세스를 반복 한 다음 다시 한 번 원래 순서로 돌아가는 것이 좋습니다. – acjay

+0

실제로 그렇습니다. 여전히 나에게 마법처럼 보일지 모르지만, 사실 그것은 일을합니다. 감사. – Dschoni

0

이 찾고있을 수도 것처럼 소리는 여기에 내가 생각 해낸 것입니다, 재미있는 문제 따라서 현재 축을 제외한 모든 부분에 abs(a)이있는 경우 == 현재의 2D 슬라이스를 확인하고 0 인 경우 즉 비어 있음을 확인합니다. where은 삭제 색인을 제공합니다.