从numpy数组中删除某些元素而不破坏结构

3
我有一个如下的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],但它返回了一个1D数组:[ 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] 可以删除所有零而不破坏其结构?


不完全一样...那个问题/答案是关于如何掩盖元素,而不是如何移除元素。 - jkdev
Numpy数组必须要在特定轴上拥有一致的维度,所有子数组的长度都需要相同。 - Finwood
作为输出,一个数组列表可以吗? - Divakar
@HuanianZhang 输入的数组是否只包含正元素(零或更多)? - Divakar
@Divakar 是的,所有零和正元素。 - Huanian Zhang
显示剩余3条评论
2个回答

2
结果数组不能是numpy数组,因为其形状不是恒定的。因此,可能的解决方法是按照标准Python方式进行操作:
b = [row[row>0] for row in a]

1
谢谢,它有效。但我有一个愚蠢的问题。如何计算b的每个子数组的中位数?我使用np.median(b),但它失败了。 - Huanian Zhang
2
[np.median(c) for c in b] - DomTomCat
2
尝试这个:map(np.median, b) - jkdev
1
哇,@DomTomCat比我快了19秒!不过我认为两种解决方案都可以。 - jkdev
3
地图和列表推导式本质上是相同的-只是语法不同。 - hpaulj

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])]]])

实际上,我的真实数据可能在每个子数组中具有不同数量的零。对于造成的混淆我感到抱歉。我尽可能地高效实现它,因为这是我滚动中位数计算函数的一部分。非常感谢。 - Huanian Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接