numba:如何删除现有数组并将新数组分配给旧数组的名称?

numba: How to delete an existing array and assign a new array to the old array's name?

考虑以下最小的无效示例:

import numba as nb
import numpy as np

@nb.jit(nopython=True)
def resize_np_array(np_array, new_size, fill_value):
    if new_size <= np_array.shape[0]:
        return np_array
    else:
        new_shape = np_array.shape
        new_shape[0] = new_size

        new_np_array = fill_value*np.ones(new_shape, dtype=np_array.dtype)

        for i in range(np_array.shape[0]):
            new_np_array[i] = np_array[i]

        return new_np_array

@nb.jit(nopython=True)   
def test_function():
    x = np.zeros(10, dtype=np.int64)
    x = resize_np_array(x, 20, 0)

    return x

x = test_function()

以上代码将失败并出现错误:

  File "A:\anaconda\lib\site-packages\numba\typeinfer.py", line 595, in __call__
    (targetty, self.index, valty), loc=self.loc)

TypingError: Cannot resolve setitem: (int64 x 1)[0] = int64

由于行:x = resize_np_array(x, 20, 0) in test_function.

我应该如何删除存储在 x 中的任何内容,以便我可以为其重新分配一个新数组?

您的错误来自于尝试为现有 numpy 数组的 shape 属性分配一个新值;这是一个固定的事情,你不能通过重新定义它的 shape 属性(在 numpy 或 numba 中)来重塑数组。 (事实上​​,shape 是一个元组,在任何上下文中都是不可变的。)您也不必担心删除现有数组; python+numpy 应该处理是否所有对原始数组的引用都消失了(之后它的内存将被清理)。因此,只需创建一个所需新形状的新数组并将值分配给新数组即可。 (另外:使用 np.full 来保存一个步骤,或者可能更快,使用 np.empty 并只填充你知道你需要 "defaults" 的值。)以下工作(对于一维数组) .

import numba as nb

@nb.jit(nopython=True)
def resize_np_array(np_array, new_size, fill_value):
    if new_size <= np_array.shape[0]:
        return np_array
    else:
        new_shape = new_size

        new_np_array = np.empty(shape=new_shape, dtype=np_array.dtype)

        for i in range(np_array.shape[0]):
            new_np_array[i] = np_array[i]

        for i in range(np_array.shape[0], new_shape):
            new_np_array[i] = fill_value

        return new_np_array

@nb.jit(nopython=True)   
def test_function():
    x = np.zeros(10, dtype=np.int64)
    x = resize_np_array(x, 20, 1)

    return x

x = test_function()