python - Numba 中的 bool 签名

标签 python numpy numba

我在我的一些代码中使用了 Numba,仅通过添加一些 @jit 装饰器,我就获得了相当大的性能提升,这非常棒。

尝试压缩更多内容我想键入函数输​​出,因为我只需要一个 bool 数组,并且函数参数之一是整数。尽管如此,我还是遇到了一些困难。作为一个最小的工作示例,我有一个函数,例如

@jit
def start_config(size,  s, b):
    prob = np.exp(-energy(1,s)/b)
    con = np.zeros(size)
    rand_unif = np.random.uniform(0,1,size)
    for i in range(size):
        if rand_unif[i] < prob:
            con[i] = 1
        else:
            con[i] = 0
    return con

它根据特定参数生成由 1 和 0 组成的 Numpy 数组 con。 该数组由 Float64 数字填充,这有点矫枉过正,因为我会避开 bool 值。

第一件事是,如果我尝试将 bool 值分配给 con,如

@jit
def start_config(size,  s, a):
    prob = np.exp(-energy(1,s)/a)
    con = np.zeros(size)
    rand_unif = np.random.uniform(0,1,size)
    for i in range(size):
        if rand_unif[i] < prob:
            con[i] = True
        else:
            con[i] = False
    return con

它仍然返回 Float64 元素,这是我的第一个困惑点。

因此我尝试了

@jit(nopython = True)
def start_config(size,  s, a):
    prob = np.exp(-energy(1,s)/a)
    con = np.zeros(size, dtype=bool)
    rand_unif = np.random.uniform(0,1,size)
    for i in range(size):
        if rand_unif[i] < prob:
            con[i] = True
        else:
            con[i] = False
    return con

没有 Numba,数组现在被初始化为 bool 值,我可以确认。通过检查类型。但是如果我用 Numba 的 @jit 装饰,我会在调用函数时出错,

No implementation of function Function(<built-in function zeros>) found for signature:

最终,我想使用 Numba 甚至添加一个函数签名,因为我认为这会对 Numba 有所帮助,例如(这个语法完全正确吗?)

@jit(boolean(int32, float64, float64), nopython=True)

如何实现?

感谢您的帮助

最佳答案

您对 np.zeros 的调用中断了,因为 numba 在使用 nopython 时需要实际的 numpy 类型> 旗帜。只需将它切换到 numpy 版本,它应该可以正常工作:

con = np.zeros(size, dtype=np.bool_)

关于你的第二点,你几乎是正确的,你需要将返回类型声明为 bool 数组(此外我发现只传递字符串而不是导入实际类型很方便):

@jit("boolean[:](int32, float64, float64)", nopython=True)

关于python - Numba 中的 bool 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66735116/

相关文章:

python 安装 numpy 和 matplotlib 异常(使用 pip)

python - pandas 与复杂类型列不兼容的形状

Python如何对二维数据的大点云进行插值

python - 转换 Pandas 数据框中的日期/时间列

python - 在用户登录之前阻止侧栏上的按钮?

python - 为什么 python 在 Ubuntu 和 MacOS 上解析日期的方式不同?

python - numba 中的函数类型

python - 如何将一些字符串粘贴到 Python 中的事件窗口?

python - 声明 Numba Vectorize 返回两个变量

python-3.x - 断言错误 : Failed in nopython mode pipeline (step: analyzing bytecode)