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()
考虑以下最小的无效示例:
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()