【问题标题】:Indexing empty array, Numba vs. Numpy索引空数组,Numba 与 Numpy
【发布时间】:2019-04-21 21:57:03
【问题描述】:

我正在试验 NumbaNumpy 的行为以进行数组索引,但我遇到了一些我不太了解的东西;所以我希望有人可以为我指出正确的方向,这可能是一个非常简单的问题。下面是两个函数,它们都使用 np.arange 命令创建一个空数组。然后,我使用索引 0 example[0] = 1“追加”(尝试各种方法以查看 NumbaNumpy 如何执行/中断)到数组。

带有jitNumba 函数运行没有错误,但Numpy 示例给出了错误:

IndexError: index 0 is out of bounds for axis 0 with size 0

Numpy 错误是有道理的,但我不确定为什么启用了jitNumba 允许操作没有错误。

import numba as nb
import numpy as np

@nb.jit()
def funcnumba():
    '''
    Add item to position 0 using Numba
    '''
    example = np.arange(0)
    example[0] = 1
    return example

def funcnumpy():
    '''
    Add item to position 0 using Numpy. This produces an error which makes sense
    '''
    example = np.arange(0)
    example[0] = 1
    return example

print(funcnumba())

print(funcnumpy())

【问题讨论】:

    标签: python numpy numba


    【解决方案1】:

    Numba documentation on arrays

    目前没有对数组索引和切片的边界检查 (...)

    这意味着在这种情况下您将超出数组的范围。由于它只是一个元素,您可能很幸运并侥幸逃脱,但您也可能使程序崩溃,或者更糟糕的是,默默地覆盖其他一些值。有关它的讨论,请参阅 issue #730

    【讨论】:

    • 我很困惑,为什么在没有边界检查的情况下会抛出错误?这不是更多地与 numpy 将单项数组视为标量有关吗?
    • 事实上,在我看来,np.arange(0) 似乎是在邀请古怪的行为。它有目的吗?
    • @roganjosh 引发错误的是 NumPy 函数,而不是 Numba 函数(这是有道理的,因为 NumPy 确实实现了边界检查)。 np.arange(0) 是一个空数组,而不是单项数组。 Wrt它的实用性,我会说这是一个一致性问题。无论结果是否为空,我都可能在需要工作时使用它。
    猜你喜欢
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2018-02-12
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多