删除大部分为零的矩阵列

时间:2013-04-27 11:17:58

标签: python numpy

在这种情况下,大多数意味着一列中少于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]])

3 个答案:

答案 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]])