Numba 插入不可能的值

Numba inserts impossible values

@jit(nopython=True, parallel=True)
def fn(A, V, out):
    for i in prange(out.shape[0]):
        for j in prange(out.shape[1]):
            out[i, j] = V[A[i, j]]

上面的代码偶尔会但一直,将不可能的值从V插入outout 被初始化为零,并且 V 被确认在例如05,但在 fn() 之后,out 将具有 674-1538853402 等值。 “始终如一”是指相同的 AV 总是产生相同的 out。它同时出现在 int32int64 中(后者具有更大的极值)。

怎么回事?它在 Windows 10 64 位、Python 3.7.9、NumPy 1.19.2 和 Numba 0.52.0 上。


完整代码:

import numpy as np
from numba import jit, prange

@jit(nopython=True, parallel=True)
def fn(A, V, out):
    for i in prange(out.shape[0]):
        for j in prange(out.shape[1]):
            out[i, j] = V[A[i, j]]

#%%###########################################################
A = np.round(np.abs(np.random.randn(240, 10000))).astype(int)
V = np.arange(A.max()).astype(A.dtype)
out = np.zeros(A.shape, dtype=A.dtype)

print("A:", A.min(), A.max())
print("V:", V.min(), V.max())
print("out:", out.min(), out.max())
fn(A, V, out)
print("out:", out.min(), out.max())
print("number of extremes:", (np.abs(out) > V.max()).sum())

为了极值重新运行了几次。我没有尝试过不使用 prange 或使用 parallel=False,因为它非常慢,但他们不应该这样做。

脚本的输出为:

A: 0 5
V: 0 4

所以A可以取值5。因此,当您进行赋值 out[i, j] = V[A[i, j]] 时,您有时会赋值 v[5],该值不存在,因此是极值。

如果没有并行执行,你会得到这个错误:

IndexError: index 5 is out of bounds for axis 0 with size 5

您可以通过修改 V 的定义来解决此问题:V = np.arange(A.max()+1).astype(A.dtype).