【问题标题】:Numpy's mean and standard deviation with Numba on PythonNumpy 在 Python 上使用 Numba 的均值和标准差
【发布时间】:2023-03-15 18:49:01
【问题描述】:

我正在尝试在函数中使用 Numpy 的均值和标准差函数,但它们似乎与 Numba 不兼容,尽管 Numba documentation states them as compatible

我的代码如下:

import numpy as np
import numba


a = [1, 2, 3, 4, 5, 6]

# @numba.jit(nopython=True, parallel=True)
def nmeanstd(a, n):
    b = []; c = []
    for i in range(n):
        b.append(np.mean(a))
        c.append(np.std(a))
    
    return b, c

mean, std = nmeanstd(a, 10)

查看meanstd 时的输出是预期的:

mean
Out[31]: [3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5]

std
Out[32]: 
[1.707825127659933,
 1.707825127659933,
 1.707825127659933,
 1.707825127659933,
 1.707825127659933,
 1.707825127659933,
 1.707825127659933,
 1.707825127659933,
 1.707825127659933,
 1.707825127659933]

但我不知道为什么,当我取消注释 @numba.jit 函数时,会出现以下消息:

TypingError: No implementation of function Function(<function mean at 0x11a0e6e50>) found for signature:
 
mean(reflected list(int64)<iv=None>)
 
There are 2 candidate implementations:
      - Of which 2 did not match due to:
      Overload of function 'mean': File: numba/core/typing/npydecl.py: Line 378.
        With argument(s): '(reflected list(int64)<iv=None>)':
       No match.

During: resolving callee type: Function(<function mean at 0x11a0e6e50>)

如果我注释我计算平均值的行,std 也是如此。怎么了?我虽然他们会正确地使用numba 运行。您知道使用 Numba 计算均值和标准差的任何方法吗?

【问题讨论】:

  • 如果你想要一个高效的代码,你真的应该避免使用列表(除非你正在使用一组 unbounded 项,这里不是这种情况)。请注意,Numba 不能很好地支持 Python 列表,因为它们可以包含不同类型的项目。 Numba 有自己的类型列表(但您需要将它们从/转换为缓慢的 python 列表)。

标签: python numba jit


【解决方案1】:

错误消息显示 Numba 不知道如何计算 meanlist。如果首先将输入列表转换为 numpy 数组,则您的代码可以正常工作(使用 @jit):

mean, std = nmeanstd(np.array(a), 10)

【讨论】:

    【解决方案2】:

    文档显示 NumPy 数组直接与 Numba 一起工作并且非常高效。

    如果您将 a 转换为 NumPy 数组,则该代码有效。

    mean, std = nmeanstd(np.array(a), 10)
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2018-06-17
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多