IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> NumPy 副本和视图 -> 正文阅读

[Python知识库]NumPy 副本和视图

举例 1: 赋值不会发生复制,会影响原数据

import numpy as np

a = np.arange(6)
print('我们的数组是:', a)    # 我们的数组是: [0 1 2 3 4 5]
print('调用 id() 函数:', id(a))     # 调用 id() 函数: 140526644449648

b = a
print('\na 赋值给 b:', b)     # a 赋值给 b: [0 1 2 3 4 5]
print('b 拥有相同 id():', id(b))    # b 拥有相同 id(): 140425744387968


b.shape = 3, 2
print('\n修改 b 的形状:')
print(b)
# 修改 b 的形状:
# [[0 1]
#  [2 3]
#  [4 5]]

print('\na 的形状也修改了:')
print(a)
# a 的形状也修改了:
# [[0 1]
#  [2 3]
#  [4 5]]

举例 2: 切片会复制,也会影响原数据

import numpy as np 
 
arr = np.arange(12)
print('我们的数组:', arr)   # 我们的数组: [ 0  1  2  3  4  5  6  7  8  9 10 11]

print('\n---- 创建切片,并修改切片的值 ----')
a = arr[3:]
b = arr[3:]

a[1] = 123
print(a)     # [  3 123   5   6   7   8   9  10  11]

b[2] = 234
print(a)    # [  3 123 234   6   7   8   9  10  11]
print(b)    # [  3 123 234   6   7   8   9  10  11]

print('数组arr会随之改变:', arr)     # 数组arr会随之改变: [  0   1   2   3 123 234   6   7   8   9  10  11]
print("a,b 的id是不同的:", id(a), id(b), id(arr[3:]))   # a,b 的id是不同的: 140699010952768 140699010952528 140699016116784


# 变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据中。
# 但是我们观察 a,b 的 id,他们是不同的,
# 也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。

举例 3: 视图或浅拷贝 ndarray.view()

会产生副本,副本与源数据的物理内存不在同一位置,修改副本不影响源数据

import numpy as np 

# 最开始 a 是个 3X2 的数组
a = np.arange(6).reshape(3, 2)
print('数组 a:')
print(a)
# 数组 a:
# [[0 1]
#  [2 3]
#  [4 5]]

b = a.view()
print('\n创建 a 的视图:')
print(b)
# 创建 a 的视图:
# [[0 1]
#  [2 3]
#  [4 5]]

print('\n两个数组的 id() 不同:')
print('a 的 id():', id(a))
print('b 的 id():', id(b))
# a 的 id(): 140658284522832
# b 的 id(): 140658283662592

# 修改 b 的形状,并不会修改 a
b.shape = 2, 3
print('\nb 的形状:')
print(b)
# b 的形状:
# [[0 1 2]
#  [3 4 5]]

print('\na 的形状:')
print(a)
# a 的形状:
# [[0 1]
#  [2 3]
#  [4 5]]

举例 4: 副本或深拷贝

ndarray.copy() 函数创建一个副本。
对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。

import numpy as np

a = np.array([[10, 10], [2, 3], [4, 5]])
print('数组 a:')
print(a)

print('\n创建 a 的深层副本:')
b = a.copy()
print('数组 b:')
print(b)

# b 与 a 不共享任何内容
print('\n我们能够写入 b 来写入 a 吗?', b is a)

print('\n修改 b 的内容:')
b[0, 0] = 100
print('修改后的数组 b:')
print(b)

print('\na 保持不变:')
print(a)

# 数组 a:
# [[10 10]
#  [ 2  3]
#  [ 4  5]]
# 
# 创建 a 的深层副本:
# 数组 b:
# [[10 10]
#  [ 2  3]
#  [ 4  5]]
# 
# 我们能够写入 b 来写入 a 吗? False
# 
# 修改 b 的内容:
# 修改后的数组 b:
# [[100  10]
#  [  2   3]
#  [  4   5]]
# 
# a 保持不变:
# [[10 10]
#  [ 2  3]
#  [ 4  5]]
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:14:27  更:2022-05-05 11:15:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:58:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码