2012-11-30 163 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给出了删除的索引。