我想要随机数100000+,我发现numpy适合我的项目,基于性能很好。但我想根据以下模式随机编号4位
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
在上述案例中,26个小写字母,26个大写字母和10个数字等于62个字母,让我们采取排列和组合,
我希望这些字母有4位数字,
62 ^ 4 / 4! = 615680 (Combinations)
如果我拿26个小写字母+10个数字并输出,
(26+10) ^ 4 / 4! = 69984 (Combinations)
从这两个案例中,第一个是最好的,它提供了更好的随机数,我在这里做了一些逻辑,
from numpy.random.mtrand import RandomState
import binascii
lo = 1000000000000000
hi = 999999999999999999
In [65]: %timeit [ binascii.b2a_hex(rand.randint(lo, hi, 2).tostring())[:4] for _ in xrange(100000)]
1 loops, best of 3: 272 ms per loop
但是随机数小于100000,因为它只需要小字母+数字
In [66]: len(set([binascii.b2a_hex(rand.randint(lo, hi, 2).tostring())[:4] for _ in xrange(100000)]))
Out[66]: 51210
任何人都建议我如何在numpy中实现这个?
答案 0 :(得分:8)
正如NPE所指出的,你可以使用numpy.random.choice。 这段代码能达到你想要的吗?
import numpy as np
LENGTH = 4
NO_CODES = 100000
alphabet = list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
np_alphabet = np.array(alphabet, dtype="|S1")
np_codes = np.random.choice(np_alphabet, [NO_CODES, LENGTH])
codes = ["".join(np_codes[i]) for i in range(len(np_codes))]
print(codes)
在我2岁但又不错的计算机上使用NO_CODES = 1000000
执行需要几秒钟。
答案 1 :(得分:1)
使用numpy视图可以更快地完成操作。
A, Z = np.array(["A","Z"]).view("int32")
NO_CODES = 100
LEN = 20
np.random.randint(low=A,high=Z,size=NO_CODES*LEN,dtype="int32").view(f"U{LEN}")
答案 2 :(得分:0)
使用以下代码可以使接受的答案更快一点:
import numpy as np
length = 4
n_codes = 100000
alpha_num = list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
np_codes = np.random.choice(alpha_num, size=[n_codes, length])
codes = [code.tostring() for code in np_codes]
计算机上的原始运行时:10 loops, best of 3: 204 ms per loop
。
新的运行时:10 loops, best of 3: 27.6 ms per loop
。
答案 3 :(得分:0)
其他两个答案都不适合我,但是我能够使用它们来创建以下解决方案:
import numpy as np
length = 4
n_codes = 100000
alpha_num = list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
np_codes = np.random.choice(alpha_num, size=[n_codes, length])
codes = [''.join(code) for code in np_codes]