4

在这种情况下,主要意味着一列中少于 5 个元素是非零的。矩阵是一个二维 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]])
4

3 回答 3

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。

于 2013-04-27T12:14:06.283 回答
2

好的,我想通了:

np.delete(a, np.nonzero((a==0).sum(axis=0) > 5), axis=1)
于 2013-04-27T12:15:51.357 回答
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]])
于 2013-04-27T11:47:28.600 回答