случайная выборка в питоне - PullRequest
1 голос
/ 31 декабря 2011

Я хочу ускорить это:

import random
ndim = 50000
for i in xrange(ndim):
   random.sample([j for j in xrange(ndim) if j != i], 30000)

Я думаю об использовании NumPy, но не знаю как.

Ответы [ 3 ]

1 голос
/ 31 декабря 2011

Возможное решение с использованием NumPy:

import numpy as np
from numpy.random import randint

ndim  = 50000
mndim = ndim -1
base = np.arange(1, ndim)
# addr = np.ones(mndim, dtype=int)
# addr[0] = 0
for i in xrange(5000):
     base[randint(0, mndim, 30000)]
     try:
        base[i] = i
     except IndexError:
        pass
1 голос
/ 31 декабря 2011

Использование списка допустимых значений x, который обновляется для следующего раунда после его использования:

import random
s = 3000
ndim = 5000

x = range(1, ndim)
for i in xrange(ndim):
   random.sample(x, s)
   if(i < ndim - 1): x[i] = i #update
1 голос
/ 31 декабря 2011

От NumPy Docs -

не

numpy.random.sample (размер = None)

Вернуть случайные числа с плавающей точкой в ​​полуоткрытом интервале [0.0, 1.0).

>>> np.random.random_sample()
0.47108547995356098
>>> np.random.random_sample((5,))
array([ 0.30220482,  0.86820401,  0.1654503 ,  0.11659149,  0.54323428])

так что если ваш ndim = 50000, то вы можете получить случайную выборку сверху и умножить ее на ndim и округлить до целого. Это может сработать ...

...