假设我有以下用于生成随机数的简单函数:
def my_func():
rvs = np.random.random(size=3)
return rvs[2] - rvs[1]
我想多次调用这个函数,假设调用1000次,我想将结果存储在一个数组中,例如:
result = []
for _ in range(1000):
result += [my_func()]
有没有办法使用NumPy来向量化这个操作,并让一切变得更快?如果工作流程改变了,我不介意.
假设我有以下用于生成随机数的简单函数:
def my_func():
rvs = np.random.random(size=3)
return rvs[2] - rvs[1]
我想多次调用这个函数,假设调用1000次,我想将结果存储在一个数组中,例如:
result = []
for _ in range(1000):
result += [my_func()]
有没有办法使用NumPy来向量化这个操作,并让一切变得更快?如果工作流程改变了,我不介意.
如果我没有理解错你的问题,你只需要使用np.random.rand函数:
np.random.rand(1000)
此函数创建给定形状的数组,并使用在[0,1)上均匀分布的随机样本填充该array.
您可以按如下方式矢量化:
rvs_vect = np.random.rand(10000, 3)
result = rvs_vect[:,2] - rvs_vect[:,1]
rvs_vect[:,1]
selects all rows in column 1.
rvs_vect[:,2]
selects all rows in column 2.
在我的机器上,包含np.vectorize00个元素的实例的执行时间大约比您的解决方案和其他建议的解决方案(np.vectorize和list comprehension)快np.vectorize倍.
Extras个
我已经为你准备了一个Numba的例子.Numba是一个开放源码的JIT编译器,它将部分Python和NumPy代码翻译成快速的机器码. 虽然在这种类型的手术中,你不会获得比NumPy更大的优势.
import numba as nb
nb.njit
def my_rand(n):
rvs_vect = np.random.rand(n, 3)
return rvs_vect[:,2] - rvs_vect[:,1]