You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:24:16