2016-06-08 92 views
3

我有一个如下的numpy数组,我想删除所有的零。从numpy数组中删除某些元素而不破坏结构

a = [[ 5 2 0 9 4] 
[ 2 0 9 4 2] 
[ 0 9 4 2 6] 
[ 9 4 2 6 8] 
[ 4 2 6 8 0] 
[ 2 6 8 0 3] 
[ 6 8 0 3 11] 
[ 8 0 3 11 7] 
[ 0 3 11 7 1] 
[ 3 11 7 1 5] 
[11 7 1 5 21] 
[ 7 1 5 21 8] 
[ 1 5 21 8 0] 
[ 5 21 8 0 18] 
[21 8 0 18 12] 
[ 8 0 18 12 3] 
[ 0 18 12 3 9]] 

我想删除所有零后,如下是:

b = [[ 5 2 9 4] 
[ 2 9 4 2] 
[ 9 4 2 6] 
[ 9 4 2 6 8] 
[ 4 2 6 8] 
[ 2 6 8 3] 
[ 6 8 3 11] 
[ 8 3 11 7] 
[ 3 11 7 1] 
[ 3 11 7 1 5] 
[11 7 1 5 21] 
[ 7 1 5 21 8] 
[ 1 5 21 8] 
[ 5 21 8 18] 
[21 8 18 12] 
[ 8 18 12 3] 
[18 12 3 9]] 

我试图a[a>0]但它返回一维数组:[ 5 2 9 4 2 9 4 2 9 4 2 6 9 4 2 6 8 4 2 6 8 2 6 8 3 6 8 3 11 8 3 11 7 3 11 7 1 3 11 7 1 5 11 7 1 5 21 7 1 5 21 8 1 5 21 8 5 21 8 18 21 8 18 12 8 18 12 3 18 12 3 9]。我不知道是否有像这样的命令a[a>0,axis=1]删除所有的零而不破坏它的结构?

+0

看看这个答案:http://stackoverflow.com/a/15773628/2666859 – Serenity

+0

不完全一样...这个问题/答案是关于[如何屏蔽元素(https://开头计算器.com/questions/15773570 /试图掩盖2d-numpy-arrays-based-values-in-one-column/15773628),而不是如何删除元素。 – jkdev

+0

Numpy数组_具有一致的维度,沿着特定的轴线,所有的子数组需要具有相同的长度 – Finwood

回答

2

结果数组不能是一个numpy数组,因为它的形状不是恒定的。因此,一个可能的解决办法是做标准的Python的方式:

b = [row[row>0] for row in a] 
+1

谢谢,它的工作原理。但我有一个愚蠢的问题。我怎么能计算每个b的子阵列的中位数?我使用'np.median(b)',但失败了。 –

+2

'[np.median(c)for c in b]' – DomTomCat

+2

试试这个:'map(np.median,b)' – jkdev

1

看来你要删除的零,如果有也正是在每列零的相同的数字。请注意,在您的示例中,这不(可能)。

b=np.hstack([y.reshape((len(y),1)) for y in [x[x>0] for x in [a[:,i] for i in range(a.shape[1])]]]) 
+0

其实我的真实数据可能在每个子数组中有不同数量的零。对困惑感到抱歉。我尝试尽可能高效地实现它,因为它是我的滚动中值计算函数的一部分。非常感谢。 –