过滤其中一个值为0的列

时间:2013-10-16 11:07:42

标签: python numpy

我想过滤列中其中一个值为0的列。所以

>>> test = numpy.array([[3,2,3], [0,4,2],[2,3,2]])
>>> test
[[3 2 3
  0 4 2
  2 3 2]]

会变成

>>> test[somefilter]
[[2 3
  4 2
  3 2]]

我认为这可以通过

来完成
>>> test[:, ~numpy.any(0, axis=0)]

但这只是最后一栏。

4 个答案:

答案 0 :(得分:3)

在您的代码中,numpy.any(0, axis=0)会测试“0”中的任何值是否为非零值,因此它始终会评估False。因此,~numpy.any(0, axis=0)将始终评估True,它会被转换为索引1,因此您总是会返回第1列。

相反,您希望在test中查找行值中没有任何零的列:

test[:, ~numpy.any(test == 0, axis=0)]

或等效地,使用np.all() 所有行值非零

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

#[[2, 3]
# [4, 2]
# [3, 2]]

答案 1 :(得分:2)

在您的代码中,numpy.any(0, axis=0)始终评估为0.您需要传入test==0以检查test中的值0。

这个怎么样?

In [37]: x = numpy.any(test==0, axis=0)

In [38]: test[:,numpy.where(x== False)[0]]
Out[38]: 
array([[2, 3],
       [4, 2],
       [3, 2]])

修改

我会把这作为一种更迂回的方式做同样的事情,但我认为ali_m的答案更优雅,风格更接近于提问者的答案。代码。

答案 2 :(得分:1)

如果您想过滤一个值为0的列,您可以使用all

test[:, test.all(axis=0)]

test[:, numpy.all(test, axis=0)]

答案 3 :(得分:0)

如何不使用numpy?

arr=[[3,2,3], [0,4,2],[2,3,2]]

for lis in arr:
    for i,num in enumerate(lis):
        if num==0:
            for chk in arr:
                del chk[i]

print arr

结果:

[[2, 3], [4, 2], [3, 2]]