使用 numba 将项目设置为 numpy 数组不会执行,也不会引发任何异常

Setting item to numpy array with numba doesn't execute and it doesn't raise any exception

当我搜索为什么下面的代码不起作用的解决方案时 运行,我总是得出结论,它应该可以正常工作。

我实际上是在尝试使用 numba 来加快 RGB 图像的着色速度。我知道问题出在将项目设置到 brushOverlay 数组中,因为如果我只是获取项目并打印它,它就可以正常工作。我认为这可能是一个静态类型问题,但所有数组都是 float64 dtype。我错过了什么?谢谢!

from numba import jit
import numpy as np
import matplotlib.pyplot as plt


@jit
def numba_overlay_brush(mask, imgRGB, brushColor):
    brushOverlay = imgRGB.copy()
    yy, xx = np.nonzero(mask)
    for i in range(len(yy)):
        for j in range(len(xx)):
            for c in range(3):
                brushOverlay[i, j, c] = brushColor[c]
    return brushOverlay

# Random RGB image with float 0-1
imgRGB = np.random.randint(0, 255, size=(1024, 1024, 3))
imgRGB = imgRGB/255

# Boolean mask where to color the image RGB with red
mask = np.zeros((1024, 1024), bool)
y_center = int(1024/2)
mask[y_center:y_center+2] = True

# Red color
brushColor = np.array([1.0, 0.0, 0.0])

brushOverlay = numba_overlay_brush(mask, imgRGB, brushColor)

brushOverlay 上存在 越界 ,这会导致 分段错误 (即意外崩溃由于内存的某些部分 read/written 而未分配)。实际上,np.nonzero(mask) returns 两个大小为 2048 的数组的元组导致嵌套循环在 range(2048).

范围内迭代

请注意,默认情况下 Numba 不对 ND 数组执行任何检查(因为它会导致额外的开销)。这就是没有明确报告错误的原因。