我想过滤列中的值之一为 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)]
但这只是最后一列。
在您的代码中,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]]
在您的代码中,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
' 的答案更优雅,风格更接近提问者的代码。
如果您想过滤一个值为 0 的列,您可以使用all
:
test[:, test.all(axis=0)]
或者
test[:, numpy.all(test, axis=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]]