Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 I';我用的是;np.计数非零(myarray)>;“小价值”;在一堆numpy数组上。我可以中途停止计数吗;“小价值”;到达了吗?_Python_Arrays_Performance_Numpy - Fatal编程技术网

Python I';我用的是;np.计数非零(myarray)>;“小价值”;在一堆numpy数组上。我可以中途停止计数吗;“小价值”;到达了吗?

Python I';我用的是;np.计数非零(myarray)>;“小价值”;在一堆numpy数组上。我可以中途停止计数吗;“小价值”;到达了吗?,python,arrays,performance,numpy,Python,Arrays,Performance,Numpy,我检查的数组是布尔型的。在本例中,np.count_为nonzero()。我仍然想知道是否有一种方法可以使它更快,可能是通过同时对计数进行“大于”检查 下面是一个玩具示例,我使用一个大数组而不是大量的小数组来计时我的方法(我猜我使用“timeit”的方式,平均超过100次试验是很愚蠢的,但不管怎样),然后在一个较小的数组上做同样的事情,以证明它“应该”快得多: 大型阵列的平均时间:0.0111809413765 小阵列平均时间:9.83558325865e-07 count_nonzero()可

我检查的数组是布尔型的。在本例中,np.count_为nonzero()。我仍然想知道是否有一种方法可以使它更快,可能是通过同时对计数进行“大于”检查

下面是一个玩具示例,我使用一个大数组而不是大量的小数组来计时我的方法(我猜我使用“timeit”的方式,平均超过100次试验是很愚蠢的,但不管怎样),然后在一个较小的数组上做同样的事情,以证明它“应该”快得多:

大型阵列的平均时间:0.0111809413765

小阵列平均时间:9.83558325865e-07

count_nonzero()可能通过遍历整个数组并在运行时累积值来工作,对吗?如果有一种方法可以在达到“smallvalue”时立即停止,不是更快吗?某种“短路”

编辑:

@user2357112在阅读了您的建议后,我尝试了一个numba解决方案,它确实比count_nonzero(HugarRay)>smallvalue稍快一些!非常感谢。以下是我的解决方案:
@numba.jit(numba.boolean(numba.boolean[:],numba.int64))
def jitcountgreaterthan(HugarRay,smallvalue):
a=numba.int64(0)
因为我在Hugarray:
a+=i
如果a==smallvalue:
打破
返回a==smallvalue


我做了这个奇怪的“break,THEN return”,因为numba显然不支持for循环中的return语句,但实际上它似乎对任何事情都没有影响。

你可能需要numba或Cython来实现这一点。Compiled
numpy
code不提供这个选项。我的猜测是,自定义函数必须尽早中断才能更快地工作(平均而言)。您可能会发现关于查找第一个
nan
的讨论很有启发性:
from timeit import time
import numpy as np
hugeflatarray=np.ones(100000000, dtype=bool)
smallflatarray=np.ones(10, dtype=bool)
smallvalue=1

mytimes=[]
for i in range(100):
    t1=time.clock()
    np.count_nonzero(hugeflatarray)>smallvalue
    t2=time.clock()
    mytimes.append(t2-t1)
print("average time for huge array:"+str(np.mean(mytimes)))

mytimes=[]
for i in range(100):
    t1=time.clock()
    np.count_nonzero(smallflatarray)>smallvalue
    t2=time.clock()
    mytimes.append(t2-t1)
print("average time for small array:"+str(np.mean(mytimes)))