假设我有以下用于生成随机数的简单函数:

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.vectorizelist 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]

Python相关问答推荐

如何观察cv2.erode()的中间过程?

从单个列创建多个列并按pandas分组

sys.modulesgo 哪儿了?

如何处理必须存在于环境中但无法安装的Python项目依赖项?

按照行主要蛇扫描顺序对点列表进行排序

如何在Python中使用时区夏令时获取任何给定本地时间的纪元值?

理解Python的二分库:澄清bisect_left的使用

DataFrame groupby函数从列返回数组而不是值

根据不同列的值在收件箱中移动数据

根据在同一数据框中的查找向数据框添加值

处理(潜在)不断增长的任务队列的并行/并行方法

优化pytorch函数以消除for循环

SQLAlchemy Like ALL ORM analog

如何合并两个列表,并获得每个索引值最高的列表名称?

用渐近模计算含符号的矩阵乘法

在Python中使用if else或使用regex将二进制数据如111转换为001""

基于形状而非距离的两个numpy数组相似性

比Pandas 更好的 Select

Polars Group by描述扩展

以异步方式填充Pandas 数据帧