如何正确使用numpy.multiply的where参数?运算结果不符合预期
问题分析与解决方案
你确实踩了numpy中ufunc(通用函数)where参数的一个常见坑!我来给你拆解清楚:
为什么你的代码不符合预期?
numpy的multiply这类通用函数的where参数,作用是指定哪些位置执行运算,但它并不会自动保留未满足条件位置的原数组数值。如果没有指定out参数,numpy会创建一个全新的输出数组,对于where=False的位置,会填充对应数据类型的默认初始值(甚至可能是内存里的随机残留值),而不是原数组的数值——你看到的10058.0就是这个原因导致的意外值。
正确的实现方式
有两种可靠的方法可以达到你的需求:
方法1:布尔索引(直观易懂,推荐)
先复制原数组,再对满足条件的位置执行乘法操作:
NIR_f = NIR.copy() mask = NIR != -28672.0 NIR_f[mask] = NIR[mask] * f
这种方式逻辑直白,是numpy中处理条件运算的常用写法,几乎不会出错。
方法2:指定out参数配合where
如果你一定要用np.multiply的where参数,需要先创建原数组的副本作为输出目标,这样未满足条件的位置会保留原数组的数值:
NIR_f = NIR.copy() np.multiply(NIR, f, where=NIR != -28672.0, out=NIR_f)
这里的核心是out参数指向了原数组的副本,where为True的位置执行乘法并写入结果,False的位置则保持out的初始值(也就是原数组的数值)。
验证效果
你再测试i,j=1119,753这个位置,两种方法都会让NIR_f[i][j]和NIR[i][j]保持一致,完全符合你的预期。
内容的提问来源于stack exchange,提问作者JVL
相关产品推荐
相关产品推荐

