Python for循环内更新数组元素不生效如何解决?
核心原因
- 你的
img数组是有符号16位整型(int16),这是赋值不生效的根本原因。int16的合法取值范围是[-32768, 32767],你给负值加65536之后的结果超出了该范围,触发整型溢出机制,数值会自动模65536后回绕到负数区间,看起来就像赋值没成功。
举个实际计算例子:你第一个打印的负值是-31460,加65536后得到34076,超过int16最大值32767,34076 - 65536 = -31460,和原值完全一致,所以打印出来还是负数。 - 你写的
img[i,j] = += 65536是语法错误,正确的增量赋值写法是img[i,j] += 65536,多写了一个等号。如果运行的是错误写法会直接抛出语法异常,你能正常打印负值说明实际运行的是正确的赋值逻辑。
解决方法
- 先修改数组的数据类型,转成取值范围更大的类型即可,比如
int32或者对应无符号类型uint16,修改代码开头部分:
# 转成int32避免溢出,也可以用.astype('uint16'),根据你后续使用需求选择 img = I.astype('int32') imgx,imgy = img.shape for i in range(0,imgy): for j in range(0,imgx): if (img[i,j] < 0): img[i,j] += 65536 print(i,j,img[i,j])
- (可选优化)numpy数组原生支持向量化操作,不需要写嵌套循环,运行效率会高很多,一行就能完成全部操作:
img = I.astype('int32') img[img < 0] += 65536
内容的提问来源于stack exchange,提问作者AJz
相关产品推荐
相关产品推荐

