Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从numba创建njit装饰的numpy阵列_Python_Python 3.x_Numpy_Jit_Numba - Fatal编程技术网

Python 从numba创建njit装饰的numpy阵列

Python 从numba创建njit装饰的numpy阵列,python,python-3.x,numpy,jit,numba,Python,Python 3.x,Numpy,Jit,Numba,代码如下: import numba as nb import numpy as np @nb.njit def func(size): ary = np.array([np.arange(size),np.arange(size)+1,np.arange(size)-1]).T X = np.array([ary[1:,0] - ary[:-1,2], ary[1:,1] - ary[:-1,2], ar

代码如下:

import numba as nb
import numpy as np

@nb.njit
def func(size):
    ary = np.array([np.arange(size),np.arange(size)+1,np.arange(size)-1]).T
    X = np.array([ary[1:,0] - ary[:-1,2],
                  ary[1:,1] - ary[:-1,2],
                  ary[1:,0] - ary[1:,1]
                  ])
    return X

Z = func(10**9)
当我运行代码时,它会给我一条错误消息,我真的不明白这里发生了什么。njit修饰的函数不支持在函数内部创建新数组吗?错误消息如下所示:

TypingError: Invalid use of Function(<built-in function array>) with argument(s) of type(s): (list(array(int64, 1d, C)))
 * parameterized
In definition 0:
    TypingError: array(int64, 1d, C) not allowed in a homogeneous sequence
    raised from C:\Users\User\Anaconda3\lib\site-packages\numba\typing\npydecl.py:459
In definition 1:
    TypingError: array(int64, 1d, C) not allowed in a homogeneous sequence
    raised from C:\Users\User\Anaconda3\lib\site-packages\numba\typing\npydecl.py:459
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 C:/Users/User/Desktop/all python file/3.2.4/nb_datatype.py (65)
TypingError:函数()的类型参数使用无效:(列表(数组(int64,1d,C)))
*参数化
在定义0中:
TypingError:齐次序列中不允许使用数组(int64,1d,C)
从C:\Users\User\Anaconda3\lib\site packages\numba\typing\npydecl.py:459引发
在定义1中:
TypingError:齐次序列中不允许使用数组(int64,1d,C)
从C:\Users\User\Anaconda3\lib\site packages\numba\typing\npydecl.py:459引发
此错误通常由传递指定函数不支持的类型的参数引起。
[1] 期间:解析被调用方类型:函数()
[2] 在:在C:/Users/User/Desktop/all python文件/3.2.4/nb_datatype.py(65)中键入调用

编辑:我忘记在编辑之前转置数组,它应该是一个10^9 x 3的数组。

通过NumPy数组列表,甚至列表实例化NumPy数组,不受
numba.njit
支持。相反,请使用并通过NumPy索引分配值:

@nb.njit
def func(size):
    row_count = 3
    ary = np.empty((row_count, size))
    ranger = np.arange(size)
    ary[0] = ranger
    ary[1] = ranger + 1
    ary[2] = ranger - 1

    X = np.empty((row_count, row_count - 1))
    X[0] = ary[1:,0] - ary[:-1,2]
    X[1] = ary[1:,1] - ary[:-1,2]
    X[2] = ary[1:,0] - ary[1:,1]

    return X

Z = func(10**2)

print(Z)

array([[-1., -4.],
       [ 0., -3.],
       [-1., -1.]])

这是完整的密码吗?你有更长的追踪时间吗?(那一行看起来有点截断)这是代码中与问题相关的唯一部分。嗯,回溯似乎有一行,所以我不能100%确定使用哪一行(我不确定哪一行是65)。很抱歉,我忘了在函数中转置数组。它应该是一个10^9乘3的数组。@mathguy,当然。因此,这并没有改变我回答的要点。这是
numba.njit
不支持您想要的内容,您需要使用索引/分配。谢谢您的回答。我想知道使用np.empty创建一个numpy数组并在njit修饰函数中逐个赋值是否比不使用njit的矢量化操作创建更快?@mathguy,我不确定,您可以自己使用
timeit
来计时,看到了吗?这很有趣-似乎以前支持过?我刚刚更新了
numba
,开始出现这些错误。