Numba 2 打字错误
Numba 2 typing errors
给定一个仅由浮点数组成的数组 arr
,
我想计算每个元素与它之前的所有元素的差异,作为另一个简单数组(代码中的dists
):
@njit
def calc_dists(arr):
dists=np.array([1])
for i,j in enumerate(arr[1:]):
dists=np.append(dists, [j-k for k in arr[:i]])
return dists[1:]
在函数内部创建空 dists
数组导致 numba 出现输入错误,这就是我现在这样做的原因。但是,我现在收到以下错误:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot unify array(int64, 1d, C) and array(float64, 1d, C) for 'dists.2', defined at (7)
np.array([1])
是一个整数类型的数组,因为它包含一个整数项。由于 arr
包含浮点数, k
是一个浮点数所以 j-k
(由于 j
的二元运算和 [=28= 的语义规则导致的浮点数提升]).因此 dists
附加了一个包含浮点数的列表,而数组包含整数。这在 Numba 中是被禁止的。
问题是您希望输出数组包含整数或浮点数。假设这是浮动的,一个简单的解决方法是使用 dists=np.array([1.0])
代替。但是,最好的解决方案是始终使用 dists=np.array([1], dtype=np.float64)
.
指定带有 Numba 的 Numpy 数组的类型(防止许多错误)
话虽如此,代码效率不高。您应该尽可能避免在循环中使用 np.append
,因为它会一次又一次地重新创建一个新数组(并复制预览内容)。使用列表也不是很有效。您可以将 dist
数组预分配到正确的大小,并使用直接访问和两个 for
循环填充它(请注意,for
循环在 Numba 中比纯 C Python代码)。
给定一个仅由浮点数组成的数组 arr
,
我想计算每个元素与它之前的所有元素的差异,作为另一个简单数组(代码中的dists
):
@njit
def calc_dists(arr):
dists=np.array([1])
for i,j in enumerate(arr[1:]):
dists=np.append(dists, [j-k for k in arr[:i]])
return dists[1:]
在函数内部创建空 dists
数组导致 numba 出现输入错误,这就是我现在这样做的原因。但是,我现在收到以下错误:
TypingError: Failed in nopython mode pipeline (step: nopython frontend) Cannot unify array(int64, 1d, C) and array(float64, 1d, C) for 'dists.2', defined at (7)
np.array([1])
是一个整数类型的数组,因为它包含一个整数项。由于 arr
包含浮点数, k
是一个浮点数所以 j-k
(由于 j
的二元运算和 [=28= 的语义规则导致的浮点数提升]).因此 dists
附加了一个包含浮点数的列表,而数组包含整数。这在 Numba 中是被禁止的。
问题是您希望输出数组包含整数或浮点数。假设这是浮动的,一个简单的解决方法是使用 dists=np.array([1.0])
代替。但是,最好的解决方案是始终使用 dists=np.array([1], dtype=np.float64)
.
话虽如此,代码效率不高。您应该尽可能避免在循环中使用 np.append
,因为它会一次又一次地重新创建一个新数组(并复制预览内容)。使用列表也不是很有效。您可以将 dist
数组预分配到正确的大小,并使用直接访问和两个 for
循环填充它(请注意,for
循环在 Numba 中比纯 C Python代码)。