视图一般发生在:

  • 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]]
Categories: python

1 Comment

1 · 2024年12月5日 at 下午9:37

555

发表评论

Avatar placeholder

邮箱地址不会被公开。 必填项已用*标注