gpt4 book ai didi

python - 通过向量化使用 for 和 if-else 加速 numpy 插值?

转载 作者:行者123 更新时间:2023-12-01 04:17:42 25 4
gpt4 key购买 nike

最近,我发现瓶颈(速度变慢 - 特别是对于大型 3D 数组输入)来自于这样的代码部分:

for i in range(0, height):
for j in range(0, width):
for k in range(0, color_channels):
if k == 0:
u = 2
elif k==2:
u = 0
else:
u = 1

if ra[i,j,k] < cr[0, u]:
im[i, j, k] = 0
elif ra[i,j,k] > cr[255, u]:
im[i, j, k] = 255
else:
p = np.argmin(np.abs(ra[i,j,k]-cr[:,u]))

if ra[i,j,k] >= cr[p,u]:
p1 = p
p2 = p+1
elif ra[i,j,k] < cr[p,u]:
p2 = p
p1 = p-1

im[i,j,k] = (ra[i,j,k]-cr[p1,u])/(cr[p2,u]-cr[p1,u]) + p1 - 1

我一直认为速度变慢可能是由于必须访问各个元素、在每个步骤中执行 if-else 条件检查造成的。

我可以检查是否可以矢量化整个代码片段,而不是现在的逐元素检查方法吗? (意思是在内存中尽可能压缩代码,这样我可以在执行相同操作的同时获得更好的速度提升)

我想到了np.where(ra[i,j,k] < cr[0,u], 0, 255)或使用三元运算符 im[i,j,k] = 0 if rad[i,j,k] < crf[0,u] else 255....但我不知道如何将其扩展到 if-elif-else

已编辑

输入:转换ra[:,:,0:2]通过查找“表”cr[:,0:2] 。来自 ku ,这只是将 BGR 转换为 RGB 的值的翻转。边境案件位于 cr[0,u] & cr[255,u]哪里u是颜色 channel ,因此当它是 cr[0,u] < ra[i,j,k] < cr[255,u] 时会进行进一步处理。 。

ra:(288,432,3)

[[[ 0.01468986  0.01744777  0.02015795]
[ 0.01174445 0.01728123 0.01949396]
[ 0.01320375 0.017014 0.02134987]
...,
[ 0.00914649 0.00453902 0.00635094]
[ 0.0092403 0.00457775 0.00643213]
[ 0.00901172 0.00452492 0.00629017]]]

cr:(256,3)

  0:[[  9.80195026e-04   6.22477547e-04   8.85527540e-04]
1: [ 1.70410880e-03 1.03346918e-03 1.51404258e-03]
...
254: [ 1.00000000e+00 9.43613146e-01 8.04093277e-01]
255: [ 1.00000000e+00 9.43613146e-01 8.04093277e-01]]

输出:im[:,:,:] - Numpy 数组表示具有所有 3 个颜色 channel 的 RGB 图像,因此需要裁剪范围 (0-255)。

即时通讯:(288,432,3)

[[[ 25.89789215  31.5206012   30.38701142]
[ 19.66823847 31.2260846 29.3507531 ]
[ 22.74473678 30.75871397 32.40058188]
...,
[ 14.79645237 7.14786503 6.78260893]
[ 14.96887532 7.22807609 6.9330227 ]
[ 14.54876706 7.11865354 6.6700264 ]]]

最佳答案

您的代码通过执行线性插值来转换 ra 中的值,以获得 cr 中相应的行索引。整套嵌套循环可以使用 np.interp 替换:

# indices between 0 and 255, corresponding to the rows of cr
idx = np.arange(cr.shape[0])

im = np.empty_like(ra)
im[..., 0] = np.interp(ra[..., 0], cr[:, 2], idx) # red
im[..., 1] = np.interp(ra[..., 1], cr[:, 1], idx) # green
im[..., 2] = np.interp(ra[..., 2], cr[:, 0], idx) # blue

由于最后一行的 - 1,您的代码示例实际上生成了 -1 到 254 之间的值,因此为了完全匹配您的原始结果,您还需要从 中减去 1 >我。根据您问题的措辞,我认为这是您代码中的错误。

关于python - 通过向量化使用 for 和 if-else 加速 numpy 插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34117453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com