Python I';我用的是;np.计数非零(myarray)>;“小价值”;在一堆numpy数组上。我可以中途停止计数吗;“小价值”;到达了吗?
我检查的数组是布尔型的。在本例中,np.count_为nonzero()。我仍然想知道是否有一种方法可以使它更快,可能是通过同时对计数进行“大于”检查 下面是一个玩具示例,我使用一个大数组而不是大量的小数组来计时我的方法(我猜我使用“timeit”的方式,平均超过100次试验是很愚蠢的,但不管怎样),然后在一个较小的数组上做同样的事情,以证明它“应该”快得多: 大型阵列的平均时间:0.0111809413765 小阵列平均时间:9.83558325865e-07 count_nonzero()可能通过遍历整个数组并在运行时累积值来工作,对吗?如果有一种方法可以在达到“smallvalue”时立即停止,不是更快吗?某种“短路” 编辑: @user2357112在阅读了您的建议后,我尝试了一个numba解决方案,它确实比count_nonzero(HugarRay)>smallvalue稍快一些!非常感谢。以下是我的解决方案: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()可
@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)))