为何Numpy数组操作结果为[0 0 0]而非预期的[1 1 1]?
问题原因与解决方案
核心差异在于:Numpy数组的切片返回原数组的视图(内存引用),而普通变量赋值是值的拷贝。
Numpy代码的执行逻辑
当你执行:
import numpy as np a = np.array([[1,2,3],[4,5,6]]) a_old = a[0] a[0] = a[0] + np.array([1,1,1]) print(a[0] - a_old)
a[0]是对二维数组的第一行进行切片,Numpy为了优化性能,默认返回的是原数组的视图——也就是说a_old和a[0]指向同一块内存空间,二者是同一个数组的不同引用。- 后续
a[0] = a[0] + np.array([1,1,1])是直接在原数组的内存块上修改元素值,a_old作为同一块内存的引用,其值也会同步更新。最终a[0]和a_old的数值完全相同,相减结果自然是[0 0 0]。
普通变量的执行逻辑
对于普通整数变量:
b = 2 b_old = b b = b + 1 print(b - b_old)
- 整数是Python的不可变类型,
b_old = b会把b的值(2)拷贝一份给b_old,二者是相互独立的对象。 - 执行
b = b +1时,会创建一个新的整数对象(值为3)并赋值给b,但b_old仍然指向原来的整数2,所以二者相减结果为1。
解决方法
如果需要保存Numpy切片的原始值,避免后续修改影响,需要显式创建切片的副本:
import numpy as np a = np.array([[1,2,3],[4,5,6]]) a_old = a[0].copy() # 显式创建副本 a[0] = a[0] + np.array([1,1,1]) print(a[0] - a_old) # 输出 [1 1 1]
内容的提问来源于stack exchange,提问作者Britzel
相关产品推荐
相关产品推荐

