使用 Numba 将单例数组分配给数组元素
Assign singleton array to element of array with Numba
我正在尝试使用 Numba 的 nopython
模式将单例数组分配给 Numpy 数组中的特定元素,但我得到了 TypeError
,但我不明白为什么。没有 Numba,它工作得很好。我的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)
我可以通过将函数的第二行重写为 tmp[0, 0] = np.array([0])[0]
来绕过错误。也就是说,通过提取单例的第一个元素。但这真的有必要吗?还是我做错了什么?
It works just fine without Numba
是的,但是 numba 是关于权衡取舍的。你为了速度牺牲了一些选择和便利。
I can't figure out why.
因为(目前)没有支持将数组的单个值设置为一维数组(即使它只包含一项)的转换(或重载)。
But should this really be necessary?
可能不会。但一般来说,将数组分配给一个元素可能是一个错误,所以我(个人)喜欢它在编译时而不是在运行时引发错误。
请注意,通用案例已经支持不同的维度数组:
例如:
@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 的 nopython
模式将单例数组分配给 Numpy 数组中的特定元素,但我得到了 TypeError
,但我不明白为什么。没有 Numba,它工作得很好。我的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)
我可以通过将函数的第二行重写为 tmp[0, 0] = np.array([0])[0]
来绕过错误。也就是说,通过提取单例的第一个元素。但这真的有必要吗?还是我做错了什么?
It works just fine without Numba
是的,但是 numba 是关于权衡取舍的。你为了速度牺牲了一些选择和便利。
I can't figure out why.
因为(目前)没有支持将数组的单个值设置为一维数组(即使它只包含一项)的转换(或重载)。
But should this really be necessary?
可能不会。但一般来说,将数组分配给一个元素可能是一个错误,所以我(个人)喜欢它在编译时而不是在运行时引发错误。
请注意,通用案例已经支持不同的维度数组:
例如:
@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]]]])
但这些案例只能在 运行 时间进行评估,而且更为普遍。