随机选择列表中的所有元素

2024-04-24 11:44:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如何能够从一个具有n元素,n时间的列表中随机选择一个数字,而不必选择列表中的同一个元素两次。我编写了一个代码来选择列表中元素的序列号,但速度很慢:

>>>redshift=np.array([0.92,0.17,0.51,1.33,....,0.41,0.82])
>>>redshift.shape
(1225,)
exclude=[]
k=0
ng=1225
while (k < ng):
      flag1=0
      sq=random.randint(0, ng)
      while (flag1<1):
        if sq in exclude:
           flag1=1
           sq=random.randint(0, ng)
        else:
           print sq
           exclude.append(sq)
           flag1=0
      z=redshift[sq]
      k+=1

它不会选择列表中所有元素的序列号。


Tags: 代码元素redshift列表时间sq数字random
3条回答

为什么不把列表洗牌并遍历元素:

from random import shuffle

a = list(range(100))

shuffle(a)

>>> print(a)
[5, 82, 96, 66, 47, 62, 49, 86, 55, 4, 21, 94, 34, 46, 10, 32, 83, 13, 25, 24, 58, 74, 14, 43, 18, 42, 56, 23, 52, 36, 15, 60, 79, 29, 0, 72, 38, 88, 41, 85, 57, 69, 30, 45, 70, 31, 84, 63, 92, 48, 68, 22, 40, 59, 95, 11, 39, 78, 89, 64, 6, 20, 91, 37, 61, 28, 71, 12, 8, 19, 1, 98, 50, 97, 26, 53, 73, 17, 16, 87, 33, 9, 99, 90, 93, 81, 7, 44, 65, 80, 54, 51, 67, 27, 3, 2, 76, 77, 75, 35]

如果要保持原始列表的顺序不变,并且不想创建shuffle副本,则可以对任何n <= len(lst)使用^{}

>>> import random
>>> n = 10
>>> random.sample(xrange(n), n)
[4, 6, 5, 2, 3, 7, 9, 0, 1, 8]

因为您已经在使用一个numpy数组,所以最好使用该包中的工具。

可以将numpy.random.choicereplace=False一起使用。每个元素只使用一次:

>>> redshift=np.array([0.92,0.17,0.51,1.33,0.41,0.82])
>>> np.random.choice(redshift, redshift.size, replace=False)
array([ 0.41,  0.82,  0.17,  1.33,  0.92,  0.51])

由于每个元素只使用一次,如果尝试获取的元素超过数组大小,则会出现值错误:

>>> np.random.choice(redshift, redshift.size+1, replace=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mtrand.pyx", line 1051, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:8075)
ValueError: Cannot take a larger sample than population when 'replace=False'

如果只想将数组(或副本)洗牌到位,也可以使用np.random.shuffle

>>> redshift
array([ 0.92,  0.17,  0.51,  1.33,  0.41,  0.82])
>>> np.random.shuffle(redshift)
>>> redshift
array([ 0.41,  0.82,  1.33,  0.51,  0.92,  0.17])

请注意,将numpy数组保存在numpy中比切换回Python数据结构进行排序版本之类的操作要快得多:

>>> from timeit import timeit
>>> import random
>>> source=range(1000000)
>>> a=np.array(source)
>>> timeit('np.random.choice(a, a.size, replace=False)', setup='from __main__ import np, a', number=10)
2.971310766064562
>>> timeit('random.sample(list(a), a.size)', setup='from __main__ import random, a', number=10)
14.129850425058976

这是一个测试用例——速度快了4倍多。

相关问题 更多 >