当前位置: 首页 > 文档资料 > NumPy 教程 >

副本和视图

优质
小牛编辑
141浏览
2023-12-01

简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。

此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

  1. 我们的数组是:
  2. [0 1 2 3 4 5]
  3. 调用 id() 函数:
  4. 139747815479536
  5. a 赋值给 b:
  6. [0 1 2 3 4 5]
  7. b 拥有相同 id():
  8. 139747815479536
  9. 修改 b 的形状:
  10. [[0 1]
  11. [2 3]
  12. [4 5]]
  13. a 的形状也修改了:
  14. [[0 1]
  15. [2 3]
  16. [4 5]]

NumPy 拥有ndarray.view()方法,它是一个新的数组对象,并可查看原始数组的相同数据。 与前一种情况不同,新数组的维数更改不会更改原始数据的维数。

输出如下:

  1. [[0 1]
  2. [2 3]
  3. 创建 a 的视图:
  4. [[0 1]
  5. [2 3]
  6. [4 5]]
  7. 两个数组的 id() 不同:
  8. a 的 id():
  9. 140424307227264
  10. b 的 id():
  11. 140424151696288
  12. b 的形状:
  13. [[0 1 2]
  14. [3 4 5]]
  15. a 的形状:
  16. [[0 1]
  17. [2 3]
  18. [4 5]]

输出如下:

  1. 我们的数组:
  2. [[10 10]
  3. [ 2 3]
  4. [ 4 5]]
  5. [[10 10]
  6. [ 2 3]
  7. [ 4 5]]

ndarray.copy()函数创建一个深层副本。 它是数组及其数据的完整副本,不与原始数组共享。

  1. 数组 a:
  2. [[10 10]
  3. [ 2 3]
  4. [ 4 5]]
  5. 创建 a 的深层副本:
  6. 数组 b:
  7. [[10 10]
  8. [ 2 3]
  9. [ 4 5]]
  10. 我们能够写入 b 来写入 a 吗?
  11. False
  12. 修改 b 的内容:
  13. 修改后的数组 b:
  14. [[100 10]
  15. [ 2 3]
  16. [ 4 5]]
  17. a 保持不变:
  18. [[10 10]
  19. [ 4 5]]