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]]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)