如何修改NumPy数组值?我的代码对列表与ndarray均无效,求排查
问题原因与修复方案
你的代码失效的核心原因是:你在循环里修改的只是临时变量j,根本没碰原列表/数组里的真实元素。不管是Python原生列表还是numpy数组,这种直接遍历元素的方式都不会同步修改原数据。
针对Python列表的修复
要修改列表里的元素,必须通过索引操作,或者用更简洁的列表推导式:
方法1:列表推导式(推荐,更简洁)
import numpy as np def round2c(x): return [[0 if 0 <= num <= 0.33 else 1 for num in row] for row in x] my_list = [[0.05,0.1,0.4],[0.5,0.5,0.3]] list2 = round2c(my_list) print(list2) # 输出: [[0, 0, 1], [1, 1, 0]]
方法2:索引循环
如果你习惯用循环,就通过索引定位到要修改的元素:
def round2c(x): for i in range(len(x)): for j in range(len(x[i])): if 0 <= x[i][j] <= 0.33: x[i][j] = 0 else: x[i][j] = 1 return x
针对numpy数组的修复
numpy数组不建议用嵌套循环,用矢量化操作更高效,也能直接修改原数组或生成新数组:
方法1:布尔掩码赋值
def round2c(x): # 生成符合条件的掩码 mask = (x >= 0) & (x <= 0.33) x[mask] = 0 x[~mask] = 1 return x a = np.array([[0.05,0.1,0.4],[0.5,0.5,0.3]]) b = round2c(a) print(b) # 输出: # [[0 0 1] # [1 1 0]]
方法2:np.where 生成新数组
如果不想修改原数组,用np.where直接生成结果数组:
def round2c(x): return np.where((x >= 0) & (x <= 0.33), 0, 1)
内容的提问来源于stack exchange,提问作者carrotrabbit
相关产品推荐
相关产品推荐

