9、Numpy视图与拷贝

18 篇文章 0 订阅

系列文章:Numpy系列文章-CSDN博客      

目录

视图(View)

浅拷贝(Shallow Copy)

深拷贝(Deep Copy)

混合浅拷贝和深拷贝

总结


        在 Python 中,拷贝有两种类型:浅拷贝(shallow copy)和深拷贝(deep copy)。在 NumPy 中,这些概念也适用,并且还有视图的概念。

视图(View)

        视图是数组和其数据的另一个接口。在 NumPy 中,您可以通过切片操作创建一个数组的视图。视图仅仅是原始数组数据的一个新视角,任何对视图的修改都会反映到原始数组上,反之亦然。

创建视图

import numpy as np 

# 创建原始数组 
arr = np.array([1, 2, 3, 4, 5]) 
print("Original array:", arr) 

# 切片创建视图 
arr_view = arr[1:4] 
print("View of the array:", arr_view)

修改视图,原始数组也会改变:

# 修改视图 
arr_view[1] = 20 

print("Modified view:", arr_view) 
print("Original array after modification:", arr)

预期输出:

riginal array: [1 2 3 4 5] 
View of the array: [2 3 4] 
Modified view: [ 2 20 4] 
Original array after modification: [ 1 2 20 4 5] 

浅拷贝(Shallow Copy)

        浅拷贝创建一个新对象,但不会创建原始对象中嵌套对象的副本。在 NumPy 中,视图经常被当成浅拷贝的一种,因为它们共享同一数据块。

创建浅拷贝,在 NumPy 中创建浅拷贝,通常通过视图进行:

# 浅拷贝创建视图 
arr_shallow_copy = arr_view

深拷贝(Deep Copy)

        深拷贝创建一个新对象以及其包含的所有嵌套对象的副本。在 NumPy 中,可以使用 copy 方法来创建一个数组的深拷贝,这样生成的数组与原始数组完全独立。

创建深拷贝

# 使用 copy 方法创建深拷贝 
arr_deep_copy = arr.copy() 

# 修改深拷贝 
arr_deep_copy[0] = 100 
print("Deep copy of the array:", arr_deep_copy) 
print("Original array remains unchanged:", arr)

输出:

Deep copy of the array: [100 2 20 4 5] 
Original array remains unchanged: [ 1 2 20 4 5] 

        这里的 arr_deep_copy 是原始数组 arr 的完整副本,修改 arr_deep_copy 不会影响 arr

混合浅拷贝和深拷贝

        在 NumPy 中,如果数组包含其他数组(即嵌套数组),则浅拷贝和深拷贝的行为会有所不同。深拷贝(copy 方法)会创建所有层级的副本。

# 创建包含嵌套数组的数组 
arr_with_nested = np.array([np.array([1, 2]), np.array([3, 4])]) 

# 浅拷贝 
shallow_copy_nested = arr_with_nested.copy() 

# 深拷贝 
deep_copy_nested = np.array([sub_arr.copy() for sub_arr in arr_with_nested]) 

# 修改原始嵌套数组中的一个子数组 
arr_with_nested[0][0] = 99 
print("Original array with nested arrays:", arr_with_nested) 

# 检查浅拷贝和深拷贝 
print("Shallow copy after modification:", shallow_copy_nested) 
print("Deep copy remains unchanged:", deep_copy_nested)

输出:

riginal array with nested arrays: [array([99, 2]) array([3, 4])] 
Shallow copy after modification: [array([99, 2]) array([3, 4])] 
Deep copy remains unchanged: [array([1, 2]) array([3, 4])] 

        在这个例子中,浅拷贝 shallow_copy_nested 显示了对原始嵌套数组的修改,而深拷贝 deep_copy_nested 保持不变,因为它创建了嵌套数组的独立副本。

总结

        NumPy 中的视图、浅拷贝和深拷贝提供了不同级别的数据复制和引用机制。视图(类似于浅拷贝)允许您在不复制数据的情况下,对数组的子集进行操作;而深拷贝确保原始数据的完整独立性,允许您在保留原始数据的同时进行操作。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值