我想过滤列中其中一个值为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)]
但这只是最后一栏。
答案 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]]