如何在 numpy 数组中使用 fastrand
how to use fastrand in a numpy array
我想使用 this GitHub 页面上提供的 fastrand
库,它在用于一次生成一个随机数时工作正常。例如,
#pip install fastrand==1.2.4
import fastrand
print(fastrand.pcg32bounded(1001))
975
但是,我想在 numpy 数组中使用此方法为某些索引生成多个数字,其中上限是相应索引中存在的数字。假设我有一个 2 x 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
来提高性能。这有可能吗?
编辑:再说一遍,另一个问题是如何为生成的随机数设置下限。但是,如果需要,我可以将这个问题作为一个新问题 post 提出。
我不打算导入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
设置之间需要权衡。
我想使用 this GitHub 页面上提供的 fastrand
库,它在用于一次生成一个随机数时工作正常。例如,
#pip install fastrand==1.2.4
import fastrand
print(fastrand.pcg32bounded(1001))
975
但是,我想在 numpy 数组中使用此方法为某些索引生成多个数字,其中上限是相应索引中存在的数字。假设我有一个 2 x 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
来提高性能。这有可能吗?
编辑:再说一遍,另一个问题是如何为生成的随机数设置下限。但是,如果需要,我可以将这个问题作为一个新问题 post 提出。
我不打算导入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
设置之间需要权衡。