加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Numpy 副本与视图

发布时间:2023-07-03 09:19:13 所属栏目:教程 来源:
导读:视图是指对数据的引用,通过该引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。

副本是一个数据的完整的拷贝,如果我们对副本进行修改
视图是指对数据的引用,通过该引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。

副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。

视图一般发生在:

Numpy 的切片操作返回原数据的视图;

调用 ndarray 的 view() 函数产生一个视图。

副本一般发生在:

在对 Python 序列进行切片操作时,同时调用 deepcopy() 函数;

调用 ndarray (或其切片)的时候,同时调用 copy() 函数产生一个副本。

1. 直接赋值
1.1 ndarray 的赋值特性
对已经产生的 ndarray 对象,将该对象通过 = 方式再次赋值给其他变量,并不会创建数组对象的副本。即在该过程中产生的变量,都指向同一块物理内存地址。

案例
对于不同的变量,可以用 id() 函数来查看其对应的通用标识符,进而判断是否具有同一性。

a = np.arange()print(数组a:, a)print(数组a的id:, id(a))
打印结果为:

out:数组a: [                     ]数组a的id:
通过把 a 赋值给 b,创建一个新变量:

b = aprint(数组a:, b)print(数组a的id:, id(b))
打印结果为:

数组a: [                     ]数组a的id:
可以发现 a 和 b 的 id 完全一致,并且我们可以利用 is 判定符来佐证同一性的判定结论:

a is b
out:True
案例
在对 a 进行修改操作时,响应的效果也会同步显示在 b 变量中。

a.shape=(,)a
out:array([[ ,  ,  ,  ],   [ ,  ,  ,  ],   [ ,  , , ]])
修改 a 为二维数组,相应的,b也会产生同样的变化:

b
out:array([[ ,  ,  ,  ],   [ ,  ,  ,  ],   [ ,  , , ]])

2 视图或浅拷贝
2.1 ndarray.view()
ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数。

a = np.arange().reshape(,)print(数组a:, a)print(数组a的id:, id(a))
打印结果为:

数组a: [[ ][ ][ ]]数组a的id:
创建 a 的视图 b:

b = a.view()print(视图b:, b)print(视图b的id:, id(b))
打印结果为:

视图b: [[ ]
         [ ]
         [ ]]视图b的id:
可以看到,在视图产生的过程中,a 和 b 的 id 并不一致,这说明视图和直接赋值是不一样的。

案例
对视图 b 进行元素修改,该修改会同步反馈在变量 a 中:

b[,]=print(数组b:, b)print(数组a:, a)
打印结果为:

数组b: [[   ]
         [     ]
         [     ]]数组a: [[   ]
         [     ]
         [     ]]
案例
对视图 b 进行形状修改,并不影响到 a:

b.shape=,print(数组b:, b)print(数组a:, a)
打印结果为:

数组b: array([[,   ,   ],[  ,   ,   ]])数组a: [[   ]
         [     ]
         [     ]]
         
2.2 切片
使用切片创建视图修改数组元素会影响到原始数组。

arr = np.arange()print (数组arr:, arr)
创建的 arr 数组为:

数组arr: [                     ]
分别通过切片产生 a 和 b:

a=arr[:]b=arr[:]print(修改前的切片a:, a)print(修改前的切片b:, b)
切片结果 a 和 b 为:

修改前的切片a: [               ]修改前的切片b: [               ]
分别改变切片 a 和 b 中的元素:

a[]=b[]=print(修改后的切片a:, a)print(修改后的切片b:, b)
修改后的 a 和 b 为:

修改后的切片a: [                    ]修改后的切片b: [                    ]
可以看到,对 a 和 b 所做的修改,都同时出现了。这说明切片直接是互相影响的。

print(修改后的原数组arr:, arr)
打印结果为:

修改后的原数组arr: [                             ]
综合看下来,我们可以发现:变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据和相关切片中。

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章