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代码)。