考虑以下最小的不工作示例:
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
中存储的内容,以便重新分配新数组?
答案 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()