Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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将单例数组分配给数组的元素_Python_Numpy_Error Handling_Runtime Error_Numba - Fatal编程技术网

Python 使用Numba将单例数组分配给数组的元素

Python 使用Numba将单例数组分配给数组的元素,python,numpy,error-handling,runtime-error,numba,Python,Numpy,Error Handling,Runtime Error,Numba,我试图使用Numba的nopython模式将单例数组分配给Numpy数组中的特定元素,但是我得到了TypeError,我不知道为什么。它没有麻木也能正常工作。我的MCVE在下面 import numpy as np from numba import jit @jit(nopython=True) def mcve(): tmp = np.zeros((2,2)) tmp[0, 0] = np.array([0]) if __name__ == "__main__":

我试图使用Numba的
nopython
模式将单例数组分配给Numpy数组中的特定元素,但是我得到了
TypeError
,我不知道为什么。它没有麻木也能正常工作。我的MCVE在下面

import numpy as np
from numba import jit


@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0, 0] = np.array([0])


if __name__ == "__main__":
    mcve()
我得到的错误如下

Traceback (most recent call last):
  File "C:/Users/User/Dropbox/Work/Stockholms universitet/Uppsatser/Hyresregleringen/supplementary/pythontest/test.py", line 12, in <module>
    mcve()
  File "C:\Users\User\Anaconda3\lib\site-packages\numba\dispatcher.py", line 348, in _compile_for_args
    error_rewrite(e, 'typing')
  File "C:\Users\User\Anaconda3\lib\site-packages\numba\dispatcher.py", line 315, in error_rewrite
    reraise(type(e), e, None)
  File "C:\Users\User\Anaconda3\lib\site-packages\numba\six.py", line 658, in reraise
    raise value.with_traceback(tb)
numba.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot resolve setitem: array(float64, 2d, C)[(0, 0)] = array(int64, 1d, C)
回溯(最近一次呼叫最后一次):
文件“C:/Users/User/Dropbox/Work/Stockholms universite/Uppsatser/Hyresregleringen/supplemental/pythontest/test.py”,第12行,在
mcve()
文件“C:\Users\User\Anaconda3\lib\site packages\numba\dispatcher.py”,第348行,位于\u compile\u for \u args中
重写错误(例如,“键入”)
文件“C:\Users\User\Anaconda3\lib\site packages\numba\dispatcher.py”第315行出现错误\u重写
重放(类型(e),e,无)
文件“C:\Users\User\Anaconda3\lib\site packages\numba\six.py”,第658行,在reraise中
通过_回溯(tb)提升值
numba.errors.TypingError:在nopython模式管道中失败(步骤:nopython前端)
无法解析集合项:数组(float64,2d,C)[(0,0)]=数组(int64,1d,C)
我可以通过将函数的第二行重写为
tmp[0,0]=np.array([0])[0]
来绕过这个错误。也就是说,通过提取singleton的第一个元素。但这真的有必要吗?还是我只是做错了什么

它没有麻木也能正常工作

是的,但numba要做的是权衡。为了速度,你牺牲了一些选择和便利

我不明白为什么

因为(目前)没有支持将数组的单个值设置为1d数组的转换(或重载)(即使它只包含一个项)

但这真的有必要吗

可能不会。但一般来说,将数组分配给一个元素可能是错误的,所以我(个人)喜欢它在编译时而不是在运行时引发错误

请注意,通用案例已经支持不同的维度数组:

例如:

@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0:1, 0:1] = np.array([2])

@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0:1, 0:1] = 2

@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0:1, 0:1] = np.array([[[[5]]]])

但是,这些情况只能在运行时进行评估,而且更为普遍。

如果没有Numba,这只适用于大小为1的1D阵列。问题可能是,Numba无法在编译时检查数组的大小(仅numdims、contigous、dtype)。