2017-10-06 34 views
0

我想從矩陣中找到非零值超過n次的行並清理它,但我只能用for循環的方式來找到。是否可以找到沒有for循環的矩陣的每一行的np.count_nonzero?

例如,清理具有超過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

整個陣列上使用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 
相關問題