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

NumPy中arr_2=arr、arr.view()、arr.copy()三者的区别是什么?

问题原因

你测试得到的结果不符合预期,核心原因是测试操作不符合view/copy的验证规则:你大概率是对arr_2做了整体重新赋值(比如arr_2 = np.array([1,2,3])、arr_2 = arr * 2这类操作),而不是修改数组内部的元素。整体重新赋值会直接改变变量指向的内存地址,直接断开原有数组的关联,自然不管用哪种写法都会得到类似copy的效果。

三种写法的实际表现

1. arr_2 = arr

这是Python层面的引用绑定,相当于给同一个numpy数组对象起了别名,不属于numpy定义的view范畴,但表现和view完全一致:

  • 修改数组内部元素(比如arr[0] = 99),arr_2对应位置会同步变化
  • 对arr_2整体重新赋值时,只是改变变量指向的对象,不会影响原数组

2. arr_2 = arr.view()

这是numpy官方定义的视图,两个数组对象共享底层的数据缓冲区,但是各自的shape、dtype等元信息独立:

  • 修改数组内部元素时,两个数组同步变化
  • 修改任意一个数组的shape、dtype等属性,不会影响另一个数组

3. arr_2 = arr.copy()

这是numpy的深拷贝,会完全复制底层的数据缓冲区,两个数组完全独立,不管修改内部元素还是数组属性,都不会互相影响。

正确验证示例

用下面的代码测试就能得到你预期的(view, view, copy)表现:

import numpy as np

# 测试直接赋值
arr = np.array([1,2,3,4])
arr_2 = arr
arr[0] = 99
print(arr_2) # 输出 [99  2  3  4],同步变化

# 测试view()
arr = np.array([1,2,3,4])
arr_2 = arr.view()
arr[1] = 88
print(arr_2) # 输出 [ 1 88  3  4],同步变化

# 测试copy()
arr = np.array([1,2,3,4])
arr_2 = arr.copy()
arr[2] = 77
print(arr_2) # 输出 [1 2 3 4],无变化

内容的提问来源于stack exchange,提问作者user16714199

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:45:07