是否可以在没有for循环的情况下找到每行矩阵的np.count_nonzero?

时间:2017-10-06 07:23:08

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

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

例如,清除值大于5倍的矩阵aaa的行。

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)。在这种情况下,有没有超快的方法来清理行?

1 个答案:

答案 0 :(得分: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