繁体   English   中英

优化函数切片numpy数组

[英]Optimize function slicing numpy arrays

我有以下函数,该函数需要一个numpy的float数组和一个整数作为其参数。 数组“计数”中的每一行都是某个实验的结果,我想随机绘制一个实验列表并将其相加,然后重复此过程以创建许多样本组。

def my_function(counts,nSamples):
    ''' Create multiple randomly drawn (with replacement)
        samples from the raw data '''
    nSat,nRegions = counts.shape
    sampleData = np.zeros((nSamples,nRegions))
    for i in range(nSamples):
        rc = np.random.randint(0,nSat,size=nSat)
        sampleData[i] = counts[rc].sum(axis=0)
    return sampleData

这个函数似乎很慢,通常计数大约有100,000行(和4列),nSamples大约是2000。 还有什么其他方法可以尝试提高速度?

我在函数上运行了cProfile,并获得了以下输出。

在60.208秒内调用8005函数

订购:标准名称

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)

    1    0.000    0.000   60.208   60.208 <string>:1(<module>)

 2000    0.010    0.000   13.306    0.007 _methods.py:31(_sum)

    1   40.950   40.950   60.208   60.208 optimize_bootstrap.py:25(bootstrap)

    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

 2000    5.938    0.003    5.938    0.003 {method 'randint' of 'mtrand.RandomState' objects}

 2000   13.296    0.007   13.296    0.007 {method 'reduce' of 'numpy.ufunc' objects}

 2000    0.015    0.000   13.321    0.007 {method 'sum' of 'numpy.ndarray' objects}

    1    0.000    0.000    0.000    0.000 {numpy.core.multiarray.zeros}

    1    0.000    0.000    0.000    0.000 {range}

你确定

rc = np.random.randint(0,nSat,size=nSat)

是您想要的,而不是size=someconstant 否则,您将对所有行进行多次重复求和。


编辑是否有助于将切片完全替换为矩阵产品:

rcvec=np.zeros(nSat,np.int) for i in rc: rcvec[i]+=1 sampleData[i] = rcvec.dot(counts)

(也许numpy中有一个函数可以使您更快地使用rcvec)

只需一次为np.random.randint2D大小生成所有索引,就可以使用它们将它们索引到counts数组中,然后沿着第一个轴求和,就像处理循环的那样。

因此,一种矢量化的方式以及这样一种更快的方式,将像这样-

RC = np.random.randint(0,nSat,size=(nSat, nSamples))
sampleData_out = counts[RC].sum(axis=0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM