NumPy 副本和视图

NumPy 副本和视图,第1张

举例 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]]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/798249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存