视图一般发生在:
- 1、numpy 的切片操作返回原数据的视图。
- 2、调用 ndarray 的 view() 函数产生一个视图。、
副本一般发生在:
- Python 序列的切片操作,调用deepCopy()函数。
- 调用 ndarray 的 copy() 函数产生一个副本。
ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数变化不会改变原始数据的维数。
import numpy as np
a = np.arange(6).reshape(3, 2)
print(a)
b = a.view()
print(b)
print(id(a))
print(id(b))
b.shape = (2, 3)
print(b)
print(a)
[[0 1]
[2 3]
[4 5]]
[[0 1]
[2 3]
[4 5]]
4747056016
4747056208
[[0 1 2]
[3 4 5]]
[[0 1]
[2 3]
[4 5]]
使用切片创建视图修改数据会影响到原始数组:
import numpy as np
arr = np.arange(12)
print(arr)
a = arr[3:]
b = arr[3:]
a[1] = 123
b[2] = 234
print(arr)
print(id(a), id(b), id(arr[3:]))
[ 0 1 2 3 4 5 6 7 8 9 10 11]
[ 0 1 2 3 123 234 6 7 8 9 10 11]
4702405808 4702405712 4702405904
副本或深拷贝
ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
import numpy as np
a = np.array([[10, 10], [2, 3], [4, 5]])
print(a)
b = a.copy()
print(b)
print(b is a)
b[0, 0] = 100
print(b)
print(a)
[[10 10]
[ 2 3]
[ 4 5]]
[[10 10]
[ 2 3]
[ 4 5]]
False
[[100 10]
[ 2 3]
[ 4 5]]
[[10 10]
[ 2 3]
[ 4 5]]
1 Comment
1 · 2024年12月5日 at 下午9:37
555