使用 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 数组执行任何检查(因为它会导致额外的开销)。这就是没有明确报告错误的原因。
当我搜索为什么下面的代码不起作用的解决方案时 运行,我总是得出结论,它应该可以正常工作。
我实际上是在尝试使用 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 数组执行任何检查(因为它会导致额外的开销)。这就是没有明确报告错误的原因。