如何使这个函数以数组数组作为输入,使用numba编译?

2024-10-06 07:33:12 发布

您现在位置:Python中文网/ 问答频道 /正文

函数的签名是

def SLBQP(Q, q, u, a, x, eps=1e-6, maxIter=1000):

它返回一个float64

参数的类型包括:

Q -- np.array([[1., 2.], [4., 5.]])
q -- np.array([1.,2.,3.,4.])
u -- a scalar
a -- np.array([1.,2.,3.,4.])
x -- np.array([1.,2.,3.,4.])

我试过了

@jit('f8(f8[:,:], f8[:], f8, f8[:], f8[:], f8, i4)',nopython=True)
def SLBQP(Q, q, u, a, x, eps=1e-6, maxIter=1000):

这给了我一个错误:

Invalid use of Function(<built-in function array>) with argument(s) of type(s): (array(float64, 1d, C))
 * parameterized
In definition 0:
    TypingError: array(float64, 1d, C) not allowed in a homogeneous sequence
    raised from /Users/gerardozinno/Desktop/ProgettoML/venv/lib/python3.8/site-packages/numba/typing/npydecl.py:472
In definition 1:
    TypingError: array(float64, 1d, C) not allowed in a homogeneous sequence
    raised from /Users/gerardozinno/Desktop/ProgettoML/venv/lib/python3.8/site-packages/numba/typing/npydecl.py:472

我也试过:

@jit('numba.float64(numba.array(float64, 2d, C), numba.array(float64, 1d, C), numba.float64, numba.array(float64, 1d, C), numba.array(float64, 1d, C), numba.float64, numba.int64)',nopython=True)

它给了我一个语法错误

编辑:

我试着用这个签名:

@nb.njit('f8(f8[:,:], f8[:], f8, f8[:], f8[:], f8, i4)')

由Thane Brooker在回答部分提出,它给了我以下错误:

Invalid use of Function(<built-in function array>) with argument(s) of type(s): (array(float64, 1d, C))
 * parameterized
In definition 0:
    TypingError: array(float64, 1d, C) not allowed in a homogeneous sequence
    raised from /Users/gerardozinno/Desktop/ProgettoML/venv/lib/python3.8/site-packages/numba/typing/npydecl.py:472
In definition 1:
    TypingError: array(float64, 1d, C) not allowed in a homogeneous sequence
    raised from /Users/gerardozinno/Desktop/ProgettoML/venv/lib/python3.8/site-packages/numba/typing/npydecl.py:472
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: resolving callee type: Function(<built-in function array>)
[2] During: typing of call at /Users/gerardozinno/Desktop/NUOVO/ProgettoML/svr/SLBQP.py (119)


File "SLBQP.py", line 119:
def SLBQP(Q, q, u, a, x, eps=1e-6, maxIter=1000):
    <source elided>
        v = np.dot(Qx,x) + np.dot(q, x)
        g = np.array(Qx+q)
        ^

Tags: ofinpytypingnpfunctionarrayusers
2条回答

我通过在函数之前编写这段代码解决了这个问题

from numba.extending import overload

@overload(np.array)
def np_array_ol(x):
    if isinstance(x, types.Array):
        def impl(x):
            return np.copy(x)
    return impl

@nb.njit('f8(f8[:,:], f8[:], f8, f8[:], f8[:], f8, i4)')
def SLBQP(Q, q, u, a, x, eps=1e-6, maxIter=1000):
    ...

Apparently编辑部分中写入的错误是由numba中的错误引起的

这是正确的

import numba as nb
import numpy as np

@nb.njit('f8(f8[:,:], f8[:], f8, f8[:], f8[:], f8, i4)')
def SLBQP(Q, q, u, a, x, eps=1e-6, maxIter=1000):
    return 1.

Q = np.array([[1., 2.], [4., 5.]])
q = np.array([1.,2.,3.,4.])
u = 50
a = np.array([1.,2.,3.,4.])
x = np.array([1.,2.,3.,4.])

result = SLBQP(Q, q, u, a, x, eps=1e-6, maxIter=1000)

我更改了您的示例Q变量(我假设这是一个输入错误),但除此之外,我无法复制您的语法错误。我猜传递给函数的Q是一维数组,而不是你认为的二维数组。请查看Q.shapeQ.flags以进行检查

相关问题 更多 >