NumPy 数组复制与视图详解

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
云原生网关 MSE Higress,422元/月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: NumPy 的复制和视图用于创建新数组。复制创建独立于原数组的新数组,如 `arr.copy()`、`np.array(arr)` 和 `arr[:]`。视图则是原始数组的引用,修改会影响原数组,如 `arr.view()`、切片和 `arr.reshape()`。使用 `arr.base` 可检查数组是否为视图。练习:创建数组 `arr` 并用三种方法创建副本,验证它们是否独立。

NumPy 数组的复制与视图

NumPy 数组的复制和视图是两种不同的方式来创建新数组,它们之间存在着重要的区别。

复制

复制 会创建一个包含原始数组相同元素的新数组,但这两个数组拥有独立的内存空间。这意味着对复制进行的任何更改都不会影响原始数组,反之亦然。

创建副本可以使用以下方法:

arr.copy():创建一个新的数组,该数组包含与原始数组相同元素的副本。
np.array(arr):将数组转换为新的 NumPy 数组。
arr[:]:使用切片创建整个数组的副本。

示例:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 创建副本
copy = arr.copy()

# 修改副本
copy[2] = 100

# 打印原始数组和副本
print(arr)
print(copy)

输出:

[ 1  2  3  4  5]
[ 1  2 100  4  5]

视图

视图 是对原始数组数据的引用,不拥有独立的内存空间。这意味着对视图进行的任何更改都会直接反映在原始数组中,反之亦然。

创建视图可以使用以下方法:

arr.view():创建一个新的数组,该数组是原始数组数据的视图。
arr[start:end]:使用切片创建原始数组的视图。
arr.reshape():改变数组的形状,但不改变底层数据。

示例:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 创建视图
view = arr.view()

# 修改视图
view[2] = 100

# 打印原始数组和视图
print(arr)
print(view)

输出:

[ 1  2 100  4  5]
[ 1  2 100  4  5]

检查数组是否拥有数据

我们可以使用 arr.base 属性来检查数组是否拥有其数据。如果 arr.baseNone,则数组拥有自己的数据,否则它是一个视图。

示例:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

copy = arr.copy()
view = arr.view()

print(copy.base)  # None
print(view.base)  # <ndarray object at 0x00000222588287E0>

练习

使用以下代码创建数组 arr

import numpy as np

arr = np.array([10, 20, 30, 40, 50])

并使用以下方法创建 arr 的副本:

arr.copy()
np.array(arr)
arr[:]

在每个方法之后,打印原始数组和副本,并验证它们是否相等。

在评论中分享您的代码和结果。

Sure, here is the requested Markdown formatted content:

获取数组的形状

NumPy 数组的形状描述了数组中元素的组织方式,并由包含每个维度中元素数量的元组表示。

获取数组形状

可以使用 arr.shape 属性获取 NumPy 数组的形状。它返回一个元组,其中每个元素表示相应维度的长度。

示例:

import numpy as np

# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])

# 获取数组形状
print(arr.shape)

输出:

(2, 3)

这意味着数组包含 2 行和 3 列。

形状元组的含义

形状元组中的每个元素表示相应维度的长度。例如,如果形状为 (2, 3, 4),则数组具有:

2 个行
3 列
每个元素 4 个值

使用 ndmin 创建具有特定形状的数组

我们可以使用 ndmin 参数来创建具有指定形状的新数组,即使原始数据不具有该形状。ndmin 参数指定要创建的最小维度数。如果原始数据具有比 ndmin 更高的维度,则形状将保留。如果维度数不足,则将添加新维度,并用 1 填充元素。

示例:

import numpy as np

# 使用 ndmin=5 创建一个包含值 1,2,3,4 的向量
arr = np.array([1, 2, 3, 4], ndmin=5)

print(arr)
print(arr.shape)

输出:

[[[[1 2 3 4]]]]
(1, 1, 1, 1, 4)

练习

创建以下形状的 NumPy 数组,并打印它们的形状:

一个包含 10 个元素的一维数组。
一个包含 5 行 4 列的二维数组。
一个包含 2 x 3 x 2 的三维数组。

在评论中分享您的代码和输出。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

相关文章
|
1月前
|
Python
Numpy学习笔记(四):如何将数组升维、降维和去重
本文介绍了如何使用NumPy库对数组进行升维、降维和去重操作。
32 1
|
1月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
69 10
|
1月前
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
25 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
1月前
|
Python
使用 NumPy 进行数组操作的示例
使用 NumPy 进行数组操作的示例
|
1月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
85 4
|
1月前
|
机器学习/深度学习 并行计算 调度
CuPy:将 NumPy 数组调度到 GPU 上运行
CuPy:将 NumPy 数组调度到 GPU 上运行
55 1
|
2月前
|
Python
numpy | 插入不定长字符数组测试OK
本文介绍了如何在numpy中创建和操作不定长字符数组,包括插入和截断操作的测试。
|
2月前
|
Python
NumPy 教程 之 NumPy 副本和视图 3
副本是对原始数据的完全拷贝,修改副本不影响原始数据;而视图则是原始数据的别名,修改视图会影响原始数据。视图通常在切片操作或使用`view()`函数时产生,副本则在使用`copy()`函数或Python序列切片操作及`deepCopy()`函数时生成。示例展示了如何使用`view()`创建数组视图,并说明了其对原始数组形状的影响。
34 6
|
2月前
|
Python
NumPy 教程 之 NumPy 副本和视图 5
NumPy副本和视图教程介绍副本与视图的区别:副本是对原始数据的完全拷贝,修改副本不会影响原始数据;而视图则是对原始数据的引用,修改视图会影响原始数据。视图通常在切片操作或使用`view()`函数时产生;副本则在序列切片操作、调用`deepCopy()`或使用`copy()`函数时生成。示例展示了使用`copy()`函数创建副本,并验证了修改副本不会改变原始数据。
48 4
|
2月前
|
API Python
Numpy 数组的一些集合操作
Numpy 数组的一些集合操作
30 0