Python Numpy数组遍历中负值置零及永久修改原值问题求解
问题根因
- 循环遍历
[a, b, c]时,迭代变量formater只是指向原numpy数组的临时引用,直接给formater重新赋值为普通列表,仅修改了临时变量的指向,不会修改原始的a、b、c数组 - 代码末尾
formater[count]= formater逻辑错误,属于无效操作,没有实现回写原数组的效果
修复方案1:保留原有map lambda写法
如果要沿用你现有的格式化逻辑,修改后代码如下:
import numpy as np a = np.array([2323,34,12,-23,12,4,-33,-2,-1,11,-2]) b = np.array([12,-23-1,-1,-3,-12]) c = np.array([23,45,3,13,-1992,5]) format_number = lambda n: n if n % 1 else int(n) # 把数组存入列表统一处理,处理后回写给原变量 arr_container = [a, b, c] for idx in range(len(arr_container)): processed = list(map(lambda n: 0 if n < 0 else format_number(n), arr_container[idx])) arr_container[idx] = np.array(processed) a, b, c = arr_container # 输出验证 print(a.tolist()) print(b.tolist()) print(c.tolist())
修复方案2:Numpy向量化实现(推荐)
Numpy本身支持批量操作,不需要逐元素遍历,性能更高、代码更简洁:
import numpy as np a = np.array([2323,34,12,-23,12,4,-33,-2,-1,11,-2]) b = np.array([12,-23-1,-1,-3,-12]) c = np.array([23,45,3,13,-1992,5]) for arr in [a, b, c]: # 批量将所有负值置为0 arr[arr < 0] = 0 # 按需转换为整数类型 if np.all(arr % 1 == 0): arr = arr.astype(int) # 输出验证 print(a.tolist()) print(b.tolist()) print(c.tolist())
两种方案运行后都能得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者georgehere
相关产品推荐
相关产品推荐

