【问题标题】:Assign singleton array to element of array with Numba使用 Numba 将单例数组分配给数组元素
【发布时间】:2019-04-24 13:47:47
【问题描述】:

我正在尝试使用 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] 来绕过该错误。也就是说,通过提取单例的第一个元素。但这真的有必要吗?还是我只是做错了什么?

【问题讨论】:

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

标签: python numpy error-handling runtime-error numba


【解决方案1】:

没有 Numba 也能正常工作

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

我不知道为什么。

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

但这真的有必要吗?

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

注意,广义案例已经支持不同的维度数组:

例如:

@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]]]])

但这些情况只能在运行时进行评估,并且更通用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 2017-09-29
    • 2010-10-29
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2018-07-17
    相关资源
    最近更新 更多