如何在numpy数组中使用fastrand

2024-06-26 13:12:52 发布

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

我想使用thisGitHub页面上提供的fastrand库,当用于一次生成一个随机数时,该库工作良好。比如说,

#pip install fastrand==1.2.4
import fastrand

print(fastrand.pcg32bounded(1001))
975

但是,我希望在numpy数组中使用此方法为某些索引生成多个数字,其中上界是相应索引中存在的数字。假设我有一个2乘5的numpy数组

import fastrand
arr = np.array([[8, 7, 4, 9, 9], [9, 9, 9, 7, 9]])
print(arr,"\n")

[[8 7 4 9 9]
 [9 9 9 7 7]] 

现在,我用随机数减去第二行的前两个数。我可以通过如下所示使用np.random.randint轻松做到这一点

arr[1,:2]-=  np.random.randint(arr[1,:2]) 
print(arr)
[[8 7 4 9 9]
 [4 1 9 7 7]]

我的目标是使用fastrand而不是np.random.randint来提高性能。这有可能吗

编辑:第二个注意事项是,另一个问题是如何在生成的随机数上设置下限。不过,如果需要的话,我可以把这个问题作为一个新的帖子来问


Tags: installpipimportnumpynp数字random页面
1条回答
网友
1楼 · 发布于 2024-06-26 13:12:52

我不打算导入fastrand,但我认为这个函数模拟了它的动作。我不确定终点的调整。在这里,我假设所需的范围是[0,n],而不是像numpy那样包括端点

In [52]: def fastrand(n):
    ...:     return random.randint(0,n-1)
    ...:

可以将其替换为您的初始列表理解:

In [53]: arr = np.array([[fastrand(8)+2 for i in range(5)]for j in range(2)])
In [54]: arr
Out[54]: 
array([[6, 7, 2, 6, 2],
       [5, 3, 9, 4, 7]])

正如我在评论中所说的,您也可以通过一次调用生成所有随机数。对于小数组,它可能会慢一些,但它应该可以更好地扩展。但您必须自己进行时间测试

In [55]: np.random.randint(2,10,(2,5))
Out[55]: 
array([[9, 5, 8, 6, 7],
       [8, 7, 7, 9, 8]])

具有数组上限的randint是:

In [56]: np.random.randint(arr[0,:2])
Out[56]: array([2, 4])
In [57]: np.random.randint(arr[0,:2])
Out[57]: array([5, 0])

对于标量随机整数生成器,您必须像以前一样使用列表理解。这里是1d:

In [58]: [fastrand(i) for i in arr[0,:2]]
Out[58]: [4, 6]
In [59]: [fastrand(i) for i in arr[0,:2]]
Out[59]: [5, 4]

同样,在迭代代码和较慢的numpy设置之间存在权衡

相关问题 更多 >