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
相关产品推荐
相关产品推荐

