【问题标题】:Error when trying to use NumbaPro's @vectorize decorator尝试使用 NumbaPro 的 @vectorize 装饰器时出错
【发布时间】:2014-06-13 05:51:59
【问题描述】:

NumbaPro 的 @vectorize 装饰器似乎是一种利用多核处理器进行数值计算的巧妙方法。不幸的是,以下相当小的示例会产生错误:

import numpy as np
from scipy.integrate import odeint
from numbapro import vectorize, float64, int64, jit

@vectorize([float64[:](float64[:], float64, float64, int64, float64, float64[:], float64)], target='parallel')
def heat_equation(x, t, a, p, h, dxdt, pi):
    for i in xrange(p-1):
        dxdt[i] = a * (x[i-1] - 2 * x[i] + x[i+1]) / h / h
    dxdt[0] = 2*pi*np.cos(2*pi*t)
    dxdt[p-1] = 0
    return dxdt

if __name__ == '__main__':
    p = 200
    h = 1. / (p-1)
    a = 0.125
    x = np.linspace(0, 1, p)
    y0 = np.zeros(p)
    dxdt = np.zeros(p, dtype=np.float64)
    pi = np.pi
    for i in xrange(p):
        y0[i] = 0
    timeVector = np.linspace(0, 10, 100)
    solVector = odeint(heat_equation, y0, timeVector, args=(a, p, h, dxdt, pi))
    print solVector[-1, p/2]

上面的代码使用@jit 装饰器可以正常工作,但尝试@vectorize 会出现以下错误:

ValueError: format number 1 of "array(float64, 1d, A)" is not recognized

显然,装饰器参数存在问题,但类型签名对我来说看起来是正确的。是否有一些我不遵守的其他限制?

编辑:修改代码以避免在装饰函数中使用 numpy.zeros 和 numpy.pi,根据下面 Bakuriu 的有用评论,并相应地调整收到的错误。

【问题讨论】:

  • 实际上,在您链接的示例中,zeros 通过显式的 out 参数在装饰函数的外部中使用。你做了一些完全不同的事情......
  • 所以我假设修饰函数不能包含 numpy.zeros 调用(显然同样适用于 np.pi )。我已经相应地编辑了我的代码,将装饰器更改为:@vectorize([float64[:](float64[:], float64, float64, int64, float64, float64[:], float64)], target='parallel'),将函数定义更改为def heat_equation(x, t, a, p, h, dxdt, pi)。不幸的是,这会返回一个新的 ValueError:ValueError: format number 1 of "array(float64, 1d, A)" is not recognized 我会相应地编辑我的帖子。

标签: python numpy jit anaconda numba


【解决方案1】:

用@jit 修饰的代码通常不能直接移植到@vectorize。 @vectorize 将修饰函数转换为 NumPy ufunc 核心 (http://docs.scipy.org/doc/numpy/reference/ufuncs.html)。 @vectorize 的额外限制是核心函数(被修饰的函数)的所有参数必须是标量。如果需要数组参数,请使用 @guvectorize。有关示例,请参阅http://numba.pydata.org/numba-doc/dev/ufuncs.html#generalized-ufuncs

【讨论】:

  • 在此函数上使用 @guvectorize 会产生“TypeError:'NotImplementedType' 对象不可调用”。这里有额外的类型限制吗?更一般地说,如果我的目标是使用 Numba/NumbaPro 来并行化 heat_equation 中的 for 循环,我会走错路吗?
猜你喜欢
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2012-02-16
  • 2018-04-11
  • 2012-11-05
  • 1970-01-01
相关资源
最近更新 更多