Python 如何获取numpy数组的非零元素行数?
我想找到所有条目小于1e-6或非零值数小于3的行的索引。像这样的东西会很好:Python 如何获取numpy数组的非零元素行数?,python,numpy,Python,Numpy,我想找到所有条目小于1e-6或非零值数小于3的行的索引。像这样的东西会很好: import numpy as np prob = np.random.rand(15, 500) all_zero = np.where(prob.max(1) < 1e-6 | np.nonzero(prob, axis=1) < 3) 将numpy导入为np 概率=np.rand.rand(15500) 所有零点=np,其中(prob.max(1)
import numpy as np
prob = np.random.rand(15, 500)
all_zero = np.where(prob.max(1) < 1e-6 | np.nonzero(prob, axis=1) < 3)
将numpy导入为np
概率=np.rand.rand(15500)
所有零点=np,其中(prob.max(1)<1e-6 | np.非零点(prob,轴=1)<3)
您可以使用np.logical\u或和np.sum
非零值来检查哪一行的非零元素少于3个:
all_zero = np.logical_or(prob.max(axis=1) < 1e-6, np.sum(prob != 0, axis=1) < 3)
all_zero=np.logical_或(prob.max(axis=1)<1e-6,np.sum(prob!=0,axis=1)<3)
此代码返回小于3个值的行索引列表除0以外(小于1e-6):
[i代表i,枚举中的val(prob>1e-6),如果val.sum()1e-6,axis=1)我尝试测量到目前为止提出的解决方案的执行时间:
基准数据:
prob = np.random.rand(10000, 500)
'带列表的解决方案:
%%timeit
[i代表i,枚举中的val(prob>1e-6)如果val.sum()小于3]
#每个回路39.5 ms±1.4 ms(7次运行的平均值±标准偏差,每个10个回路)
“仅解决方案numpy:
%%timeit
np.式中(np.和(prob>1e-6,轴=1)<3)
#每个回路9.92 ms±199µs(7次运行的平均值±标准偏差,每个100个回路)
客户的解决方案:
%%timeit
所有零=np.逻辑或(概率最大值(轴=1)<1e-6,np.和(概率!=0,轴=1)<3)
np.where(均为零)
#每个回路13.9 ms±150µs(7次运行的平均值±标准偏差,每个100个回路)
最有效的解决方案似乎是第二个。那么你的问题是什么?你只需要将非零
求和,即np.nonzero(prob).sum(axis=1)
。我也不理解这个问题。哦,你是对的。我没有想到将非零的数量相加。
np.where(np.sum(prob>1e-6, axis=1)<3)
prob = np.random.rand(10000, 500)
%%timeit
[i for i, val in enumerate(prob>1e-6)if val.sum() < 3]
# 39.5 ms ± 1.4 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
np.where(np.sum(prob>1e-6, axis=1) < 3)
# 9.92 ms ± 199 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
all_zero = np.logical_or(prob.max(axis=1) < 1e-6, np.sum(prob != 0, axis=1) < 3)
np.where(all_zero)
# 13.9 ms ± 150 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)