python - Numba 对没有输入的函数进行向量化

标签 python numpy vectorization numba

我想使用 numba.vectorize 并行化函数,但我的函数不接受任何输入。目前,我为从未使用过的函数使用了虚拟数组和虚拟输入。

有没有更优雅/快速的方法(可能不使用numba.vectorize)?

代码示例(不是我的实际代码,仅用于演示我如何丢弃输入):

import numpy as np
from numba import vectorize

@vectorize(["int32(int32)"], nopython=True)
def particle_path(discard_me):
    x = 0
    for _ in range(10):
        x += np.random.uniform(0, 1)
    return np.int32(x)

arr = particle_path(np.empty(1024, dtype=np.int32))
print(arr)

最佳答案

如果您只是处理一维数组,那么您可以使用以下方法,其中数组必须在函数外部实例化。在这里似乎没有任何理由使用 vectorize ,您可以简单地使用 jit 来实现目标,尽管您必须使用显式地在数组元素上编写循环这。如果您的数组始终是一维的,那么您可以使用:

import numpy as np
from numba import jit

@jit(nopython=True)
def particle_path(out):
    for i in range(len(out)):
        x = 0
        for _ in range(10):
            x += np.random.uniform(0, 1)
        out[i] = x

arr = np.empty(1024, dtype=np.int32)
particle_path(arr)

您可以使用 flat 类似地处理任意维数组。属性(并确保使用 .size 获取数组中元素的总数):

@jit(nopython=True)
def particle_path(out):
    for i in range(out.size):
        x = 0
        for _ in range(10):
            x += np.random.uniform(0, 1)
        out.flat[i] = x

arr = np.empty(1024, dtype=np.int32)
particle_path(arr)

最后,如果每次运行函数时都需要一个新数组,则可以在函数内创建数组(如果您将重复调用该函数并想要覆盖同一个数组,请使用上面的数组,从而保存一次又一次地重新分配同一数组的时间)。

@jit(nopython=True)
def particle_path(num):
    out = np.empty(shape=num, dtype=np.int32)
    for i in range(num):
        x = 0
        for _ in range(10):
            x += np.random.uniform(0, 1)
        out[i] = x
    return out

arr = particle_path(1024)

关于python - Numba 对没有输入的函数进行向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51137573/

相关文章:

Python - 读取具有不同分隔符的数据文本文件

python - 删除 array([]) 括号为矩阵方程创建干净的数组

python - 在 virtualenv 中更改已安装的 Python 模块

python - pandas 对 SparseSeries 列表的内存使用情况

python - 如何将 Pydev 项目导入交互式控制台?

python - 平衡 numpy 数组与过采样

python - 在 numpy 中获取平均面积的有效方法

python - 使用没有循环的numpy在python中用数组或向量填充数组

python - Python 标志是什么意思?

python - 为什么我的用于检测图像旋转的卷积模型对每张图片预测相同的类别?