равномерно эффективно сэмплировать целые числа в python, используя numpy / scipy - PullRequest
1 голос
/ 11 апреля 2010

У меня проблема в том, что в зависимости от результата случайного броска монеты мне нужно выбрать случайную начальную позицию из строки. Если выборка этой случайной позиции является равномерной по строке, я подумал о двух подходах, чтобы сделать это: один с использованием многочлена от numpy.random, другой с использованием простой функции randint стандартной библиотеки Python. Я проверил это следующим образом:

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()

Вывод:

Полиномиальное время заняло: 6,58072400093 секунд. Рэнд взял: 2,35189199448 секунд

мне кажется, что randint быстрее, но все же кажется мне очень медленным. Есть ли векторизованный способ сделать это намного быстрее, используя numpy или scipy?

спасибо.

1 Ответ

3 голосов
/ 11 апреля 2010

Я изменил ваш код, чтобы фактически возвращать значения (и использовал 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 для генерации массива случайных точек в строке:

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

Multinomial, по-видимому, действительно очень медленный, но разве это то, что вы хотите? Я думал, вы сказали, что хотите равномерное распределение? Использование randint от numpy - самая быстрая из всех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...