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

时间:2018-04-11 20:51:56

标签: python numpy numba

考虑以下最小的不工作示例:

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)中的行test_function

我应该如何删除x中存储的内容,以便重新分配新数组?

1 个答案:

答案 0 :(得分:2)

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

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()