Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取numpy数组的非零元素行数?_Python_Numpy - Fatal编程技术网

Python 如何获取numpy数组的非零元素行数?

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)

我想找到所有条目小于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)<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)