0

我想过滤列中的值之一为 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

4 回答 4

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]]
于 2013-10-16T11:16:34.980 回答
2

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

这个怎么样?

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' 的答案更优雅,风格更接近提问者的代码。

于 2013-10-16T11:16:21.897 回答
1

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

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

或者

test[:, numpy.all(test, axis=0)]
于 2013-10-16T11:39:20.273 回答
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]]
于 2013-10-16T11:22:42.850 回答