如何正确修改numpy ndarray指定位置元素 解决字符串数组赋值报错问题
问题解答
1. numpy put函数修改结果不符合预期的问题
原因
np.put()的索引参数对应数组扁平化后的一维索引,你传入列表[0,1]会同时修改扁平化后第0、第1位的元素,所以最终两个位置都被修改为100,和你想要修改二维坐标(0,1)的需求不符。
解决方法
- 要修改二维坐标(0,1)的元素,对应扁平化索引为
0*3 + 1 = 1,直接传单个索引即可:a.put(1, 100) - 更推荐直接用二维索引赋值,写法更直观易读:
a[0,1] = 100
2. 字符串数组修改触发TypeError的问题
原因
你提取的X = numpy_array[:,1]中每个元素X[i]是完整的字符串对象,Python的字符串属于不可变类型,不支持通过X[i][j]修改字符串内部的单个字符,你的内层j循环完全是多余的,这是报错的直接原因。
解决方法
- 方案1:删除内层循环,直接替换整个字符串元素
如果修改后发现原数组没有更新,说明for i in range(len(X)): X[i] = lemmatizeSentence(X[i])X是原数组的切片副本而非视图,直接修改原数组对应列即可:for i in range(len(numpy_array)): numpy_array[i, 1] = lemmatizeSentence(numpy_array[i, 1]) - 方案2:转列表处理后回写,兼容性更高
# 提取目标列转为列表处理 processed_col = [lemmatizeSentence(s) for s in numpy_array[:, 1]] # 处理完成后写回原数组 numpy_array[:, 1] = processed_col - 方案3:用向量化方法简化写法
vec_lemmatize = np.vectorize(lemmatizeSentence) numpy_array[:, 1] = vec_lemmatize(numpy_array[:, 1])
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

