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
插入out
; out
被初始化为零,并且 V
被确认在例如0
和 5
,但在 fn()
之后,out
将具有 674
、-1538853402
等值。 “始终如一”是指相同的 A
和 V
总是产生相同的 out
。它同时出现在 int32
和 int64
中(后者具有更大的极值)。
怎么回事?它在 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)
.
@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
插入out
; out
被初始化为零,并且 V
被确认在例如0
和 5
,但在 fn()
之后,out
将具有 674
、-1538853402
等值。 “始终如一”是指相同的 A
和 V
总是产生相同的 out
。它同时出现在 int32
和 int64
中(后者具有更大的极值)。
怎么回事?它在 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)
.