如何获取可返回替换指定值的新numpy数组的函数?禁止赋值与原地修改
解决方案:用纯函数式方法替换numpy数组中的值
嘿,我太懂这种“较劲”的感觉了——就想要那种不用赋值、纯函数式的写法对吧?刚好numpy里有几个现成的函数能满足你的需求,完全不需要原地修改原数组,直接返回新数组:
最简洁高效的方法:np.where
np.where简直是为这种场景量身定做的,它接收条件、满足条件时的值、不满足时的值,直接返回一个全新的数组,完全不会修改原数组。
放到你的lambda里就是这样:
lambda: np.where(function_returns_numpy_array() == 0, 10, function_returns_numpy_array())
如果担心重复调用function_returns_numpy_array()(比如这个函数计算成本高),可以用一个小技巧包装一下,在lambda里也能实现:
lambda: (lambda arr: np.where(arr == 0, 10, arr))(function_returns_numpy_array())
内层lambda先接收原数组,再用np.where处理,完美避免重复调用原函数。
另一种可选方法:np.vectorize(适合简单逻辑)
如果你更喜欢逐元素处理的思路,可以用np.vectorize包装一个简单的判断函数,它也会返回新数组:
lambda: np.vectorize(lambda x: 10 if x == 0 else x)(function_returns_numpy_array())
不过要注意:np.vectorize本质上是循环的包装器,效率比np.where低一些,如果你的数组很大,优先选np.where。
为什么这些方法符合要求?
- 完全没有原地修改操作(不像
np.place或者直接赋值) - 都是接收输入数组,返回全新的输出数组,纯函数风格
- 可以直接嵌入lambda表达式里,完美匹配你的需求
内容的提问来源于stack exchange,提问作者Gerges
相关产品推荐
相关产品推荐

