2012-11-30 81 views
2

我有一個關於從數組中刪除的問題。我有一個三維numpy數組(座標是z,y,x),估計大小爲900^3。只有少數值非零,但它們具有非平凡的空間分佈。我想刪除該數組中只有零的所有2D切片。換句話說,我想要一個最小大小的數組,其中仍然包含所有相關數據。從Python中的Numpy數組中刪除零

我的嘗試是這樣的:

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) 

而是一個似乎只從一開始工作,省去了零結尾。

是否有可能在3D空間中旋轉陣列?

+0

如果你想在3d空間中旋轉數組,你可以使用numpy.roll。 – ebarr

回答

0

您可以使用transpose重新排列軸,但它聽起來像是你可能真的會尋找一個sparse array

+0

我不確定,這是什麼意思。稀疏數組是2D還是不是? – Dschoni

+0

在scipy中,是的...好點。我會把它留在我的回答中,以防萬一它可能幫助有2D問題的人。人們已經實現了多維稀疏數組,這可能是很好的,這取決於你後來需要做什麼,如果你檢查了這個例子:http://www.janeriksolem.net/2010/02/sparray-sparse- n維陣列-in.html。但是,如果您的代碼適用於z方向,爲什麼不只是轉置旋轉尺寸兩次以重複該過程,然後再一次返回到原​​始順序? – acjay

+0

其實是的,那是有效的。對我來說,仍然看起來像是魔術,但實際上它完成了這項工作。謝謝。 – Dschoni

0

這是一個有趣的問題,這裏是我想出了:

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) 

因此,除了當前軸==當前2D切片之外,您還需要一些abs(a),並檢查它是否爲零,這意味着它是空的。 where給出了刪除的索引。