【问题标题】:Is it possible to find np.count_nonzero of each row of matrix without for loop?是否可以在没有 for 循环的情况下找到每行矩阵的 np.count_nonzero ?
【发布时间】:2017-10-06 07:23:07
【问题描述】:

我想从矩阵中找到非零值超过 n 次的行并清理它,但我只能想出for 循环方式。

例如,清理矩阵aaa的行,其值超过5次。

aaa = np.zeros([5,8])

aaa[0] = [0,0,0,15,21,10,0,0] <<
aaa[1] = [0,3,7,5,4,0,0,0]
aaa[2] = np.random.randint(3, size=8)
aaa[3] = np.random.randint(15, size=8)
print aaa
>> [[  0.   0.   0.  15.  21.  10.   0.   0.]
 [  0.   3.   7.   5.   4.   0.   0.   0.]
 [  1.   1.   2.   0.   2.   1.   1.   1.]
 [ 10.   9.  12.   2.  11.  12.  12.  12.]
 [  0.   0.   0.   0.   0.   0.   0.   0.]]

for row in range(5):
    print np.count_nonzero(aaa[row])
    if np.count_nonzero(aaa[row]) > 5:
        aaa[row] = 0
print aaa
>>>[[  0.   0.   0.  15.  21.  10.   0.   0.]
 [  0.   3.   7.   5.   4.   0.   0.   0.]
 [  0.   0.   0.   0.   0.   0.   0.   0.] # clean
 [  0.   0.   0.   0.   0.   0.   0.   0.] # clean
 [  0.   0.   0.   0.   0.   0.   0.   0.]]

实际上,我要做的是清除每一行中的固定噪声并保持高斯式峰值行。我的真实数据矩阵非常大(维度 = 10^5 x 10^6)。在这种情况下有什么超快速的方法可以清理行吗?

【问题讨论】:

    标签: python python-2.7 numpy for-loop matrix


    【解决方案1】:

    在整个数组上使用np.count_nonzero -

    arr[np.count_nonzero(arr,axis=1) > 5] = 0
    

    更快的版本是获取非零的布尔数组,然后进行计数 -

    arr[np.count_nonzero(arr!=0,axis=1) > 5] = 0
    

    或者,使用ndarray.sum -

    arr[(arr!=0).sum(axis=1) > 5] = 0
    

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 2019-03-11
      • 2015-06-23
      • 2013-02-16
      相关资源
      最近更新 更多