使用numpy / scipy在python中统一有效地采样整数

时间:2010-04-11 19:32:48

标签: python numpy random scipy

我有一个问题,根据随机硬币翻转的结果,我必须从字符串中采样随机起始位置。如果这个随机位置的采样在字符串上是一致的,我想到了两种方法:一个使用numpy.random中的多项式,另一个使用Python标准lib的简单randint函数。我测试了如下:

from numpy import *
from numpy.random import multinomial
from random import randint
import time

def use_multinomial(length, num_points):
    probs = ones(length)/float(length)
    for n in range(num_points):
    result = multinomial(1, probs)

def use_rand(length, num_points):
    for n in range(num_points):
    rand(1, length)

def main():
    length = 1700
    num_points = 50000

    t1 = time.time()
    use_multinomial(length, num_points)
    t2 = time.time()
    print "Multinomial took: %s seconds" %(t2 - t1)

    t1 = time.time()
    use_rand(length, num_points)
    t2 = time.time()
    print "Rand took: %s seconds" %(t2 - t1)    

if __name__ == '__main__':
    main()

输出结果为:

Multinomial:6.58072400093秒 兰德采取:2.35189199448秒

似乎randint更快,但对我来说似乎仍然很慢。有没有一种矢量化的方法可以让它更快,使用numpy或scipy?

感谢。

1 个答案:

答案 0 :(得分:3)

我将您的代码更改为实际返回值(并使用randint代替rand - 这不是您的意思吗?)就像这样......

def use_multinomial(length, num_points):
    probs = ones(length)/float(length)
    return multinomial(1, probs, num_points)

def use_rand(length, num_points):
    return [randint(1,length) for _ in range(num_points)]

然后我尝试了自己的版本,使用numpy.random.randint在字符串上生成一个numpy随机点数组:

def use_np_randint(length, num_point):
    return nprandint(1, length, num_points)

结果:

Multinomial took: 13.6279997826 seconds
Rand took: 0.185000181198 seconds
NP randint took: 0.00100016593933 seconds

多项式显然是非常慢的比较,但即使你想要的也是如此?我以为你说你想要统一发行?使用numpy的randint显然是最快的。