我想从矩阵中找到非零值超过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)。在这种情况下,有没有超快的方法来清理行?
答案 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