如何修改numpy数组的元素值?赋值后无变化是什么原因
问题原因与解决方案
核心原因
你遇到的现象并非numpy拒绝接收赋值,而是两个基础特性共同作用的结果:
- numpy数组直接通过
=赋值属于引用绑定,不会生成新的数组副本。你代码中的x_bip = x、x_bop = x实际上让三个变量x、x_bip、x_bop指向内存中完全相同的数组对象,修改任意一个变量的元素值,其余两个都会同步变更。 - 操作顺序导致增量完全抵消:你先执行
x_bip[i] = x_bip[i] + delta,此时三个变量共有的数组第i位已经加了delta;紧接着执行x_bop[i] = x_bop[i] - delta,相当于给刚加过delta的同一位置又减了delta,最终数组回到初始值,所以打印结果看不到任何变化。
修复方法
只需要在绑定变量时显式创建数组副本即可,使用numpy内置的.copy()方法:
def numerical_partial_derivative(f, x, i, dx = delta): print("delta:", delta) print("x type:", type(x)) # 显式创建独立副本 x_bip = x.copy() x_bop = x.copy() x_bip[i] = x_bip[i] + delta x_bop[i] = x_bop[i] - delta print("x, x_bip, x_bop:", x, x_bip, x_bop) return ((f(x_bip) - f(x_bop)) / (2 * dx))
修改后x_bip、x_bop和原始的x是完全独立的数组对象,修改不会互相影响,增量也不会出现抵消的问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

