在numpy中过滤掉零值的列

时间:2013-12-11 14:46:46

标签: python numpy

给定一个numpy数组A,例如:

[[    0.   482.  1900.   961.   579.    56.]
 [    0.   530.  1906.   914.   584.    44.]
 [   43.     0.  1932.   948.   556.    51.]
 [    0.   482.  1917.   946.   581.    52.]
 [    0.   520.  1935.   878.   589.    55.]]

我想得到一个新数组,它排除出现0的所有列,即:

[[  1900.   961.   579.    56.]
 [  1906.   914.   584.    44.]
 [  1932.   948.   556.    51.]
 [  1917.   946.   581.    52.]
 [  1935.   878.   589.    55.]]

我尝试的是以下内容:

non_zero = np.array([np.all(totals>0,axis=0)]*N_ROWS);    

这给了我:

[[False  False  True  True  True  True]
 [False  False  True  True  True  True]
 [False  False  True  True  True  True]
 [False  False  True  True  True  True]
 [False  False  True  True  True  True]]

麻烦的是,然后A[non_zero]返回预期值,但重新排列为一维向量。

那么,你们知道我做错了什么,或者我是否过着复杂的生活?谢谢!

更新:感谢所有答案!除了接受的答案之外还有一个简短的事情:显然,除了选择本身,我应该使用:操作数,如:

non_zero = np.array(np.all(totals!=0,axis=0));    
a[:,non_zero]

当然,还有更紧凑的方式(见接受的答案)

3 个答案:

答案 0 :(得分:5)

假设您的值是非负的:

A = np.array([[ 0, 482, 1900, 961, 579, 56.],
              [ 0, 530, 1906, 914, 584, 44.],
              [ 43, 0, 1932, 948, 556, 51.],
              [ 0, 482, 1917, 946, 581, 52.],
              [ 0, 520, 1935, 878, 589, 55.]])

A[:, np.all(A > 0, axis=0)]

哪个给了我

array([[ 1900.,   961.,   579.,    56.],
       [ 1906.,   914.,   584.,    44.],
       [ 1932.,   948.,   556.,    51.],
       [ 1917.,   946.,   581.,    52.],
       [ 1935.,   878.,   589.,    55.]])

如果忽略潜在的精度问题,可以使用np.any(A == 0, axis=0)

替换条件

答案 1 :(得分:3)

这样的事情怎么样?通过对每列中的零个数求和,找出哪些总和为零,可以找到正好为零0 s的列索引:

>>> B = A[:, np.sum(A == 0, axis=0) == 0 ]
>>> B
array([[ 1900.,   961.,   579.,    56.],
       [ 1906.,   914.,   584.,    44.],
       [ 1932.,   948.,   556.,    51.],
       [ 1917.,   946.,   581.,    52.],
       [ 1935.,   878.,   589.,    55.]])

答案 2 :(得分:2)

您可以使用:

non_zero = (A != 0)
new = A[:, non_zero.all(axis = 0)]