在这种情况下,大多数意味着一列中少于5个元素是非零的。 Matrix是一个2d ndarray。
示例数据:
a = np.array([[1,1,2,1,1],
[1,1,0,1,0],
[1,1,0,1,0],
[1,1,0,3,0],
[1,1,0,3,0],
[1,1,1,5,3],
[1,1,0,1,0],
[1,1,0,1,0],
[1,1,4,3,0],
[1,1,0,4,0],
[1,1,0,5,0],
[1,1,0,0,0]])
输出
a = np.array([[1,1,1],
[1,1,1],
[1,1,1],
[1,1,3],
[1,1,3],
[1,1,5],
[1,1,1],
[1,1,1],
[1,1,3],
[1,1,4],
[1,1,5],
[1,1,0]])
答案 0 :(得分:5)
怎么样:
>>> a[:, (a != 0).sum(axis=0) >= 5]
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 3],
[1, 1, 3],
[1, 1, 5],
[1, 1, 1],
[1, 1, 1],
[1, 1, 3],
[1, 1, 4],
[1, 1, 5],
[1, 1, 0]])
或
>>> a[:, np.apply_along_axis(np.count_nonzero, 0, a) >= 5]
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 3],
[1, 1, 3],
[1, 1, 5],
[1, 1, 1],
[1, 1, 1],
[1, 1, 3],
[1, 1, 4],
[1, 1, 5],
[1, 1, 0]])
过去我发现np.count_nonzero
要比sum
技巧快得多,但在这里 - 可能是因为需要使用np.appyly_along_axis
- 该版本是慢得多,至少对于这个a
。其他一些测试表明即使对于较大的矩阵也是如此,但是YMMV。
答案 1 :(得分:2)
好的,我已经弄清楚了:
np.delete(a, np.nonzero((a==0).sum(axis=0) > 5), axis=1)
答案 2 :(得分:1)
效率低下的版本:
>>> np.array(zip(*(i for i in zip(*a) if i.count(0) < len(i)/2)))
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 3],
[1, 1, 3],
[1, 1, 5],
[1, 1, 1],
[1, 1, 1],
[1, 1, 3],
[1, 1, 4],
[1, 1, 5],
[1, 1, 0]])