NumPy 入门:从数组创建到核心操作,解锁 Python 科学计算之力
一、为什么选择 NumPy?—— 超越 Python 列表的优势
Python 自带的列表(List)虽然灵活,但在处理大规模数值计算时效率低下。NumPy 的出现正是为了解决这一问题,它的核心优势包括:
- 高效存储与计算:NumPy 的
ndarray(N 维数组)是同类型元素的集合,存储更紧凑,计算时可利用 CPU 缓存加速,比列表快 10 倍以上; - 简化代码:支持向量化操作,无需循环即可对整个数组进行运算(如
arr * 2直接实现数组中所有元素乘以 2); - 丰富的数学函数:内置大量线性代数、统计、随机数生成等函数,覆盖科学计算的核心需求。
例如,计算一个包含 1000 万个元素的列表总和,Python 列表需要 0.12 秒,而 NumPy 数组仅需 0.02 秒,效率提升显著。
二、环境准备:安装与导入
NumPy 不是 Python 标准库,需要手动安装:
-
安装命令(推荐使用清华镜像源加速):
# 使用pip安装 pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple # 或使用conda(适用于Anaconda环境) conda install numpy -
导入方式:
惯例是将 NumPy 简写为np,方便后续调用:import numpy as np
三、核心对象:ndarray 数组
NumPy 的核心是ndarray(N-dimensional array,N 维数组),它是一个由相同类型元素组成的多维容器。理解ndarray的创建和属性,是掌握 NumPy 的第一步。
1. 创建 ndarray 数组:10 种常用方法
NumPy 提供了多种创建数组的函数,适用于不同场景:
| 函数 | 功能描述 | 示例代码 |
|---|---|---|
array() |
将列表或嵌套列表转换为数组 | np.array([1, 2, 3]) → [1 2 3] |
zeros() |
创建全为 0 的数组 | np.zeros((2, 3)) → 2 行 3 列的 0 数组 |
ones() |
创建全为 1 的数组 | np.ones((3, 2), dtype=int) → 3 行 2 列的 1 数组(整数类型) |
full() |
创建指定值填充的数组 | np.full((2, 2), fill_value=10) → 所有元素为 10 的 2x2 数组 |
eye() |
创建对角矩阵(对角线为 1,其余为 0) | np.eye(3) → 3x3 的单位矩阵 |
arange() |
生成指定范围的等差数列(类似range,但返回数组) |
np.arange(1, 10, 2) → [1 3 5 7 9] |
linspace() |
生成指定范围内的等间隔数列(包含终点) | np.linspace(0, 1, 5) → [0. 0.25 0.5 0.75 1. ] |
logspace() |
生成等比数列(以 10 为底的对数间隔) | np.logspace(1, 2, 3) → [ 10. 31.6227766 100. ] |
random.rand() |
生成 [0,1) 之间的随机数数组 | np.random.rand(2, 2) → 2x2 的随机数组 |
random.randint() |
生成指定范围内的随机整数数组 | np.random.randint(0, 10, size=(3,)) → [3 7 1] |
示例:创建一个 3 行 2 列、元素全为 1024 的整数数组:
arr = np.full((3, 2), fill_value=1024, dtype='int32')
print(arr)
# 输出:
# [[1024 1024]
# [1024 1024]
# [1024 1024]]
2. ndarray 的核心属性
通过属性可以快速了解数组的基本信息,常用属性如下:
| 属性 | 描述 |
|---|---|
ndim |
数组的维度(秩),如 1D 数组返回 1,2D 数组返回 2 |
shape |
数组的形状,如 3 行 2 列的数组返回(3, 2) |
size |
数组元素的总个数,等于shape中各维度的乘积(如 3×2 数组的 size 为 6) |
dtype |
元素的数据类型(如int32、float64) |
itemsize |
每个元素的字节大小(如int32类型的itemsize为 4) |
示例:查看数组属性:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("维度:", arr.ndim) # 输出:2
print("形状:", arr.shape) # 输出:(2, 3)
print("元素总数:", arr.size) # 输出:6
print("数据类型:", arr.dtype) # 输出:int64
四、数组操作:切片与索引
和 Python 列表类似,ndarray支持通过索引和切片访问元素,但多维数组的操作更灵活。
1. 一维数组的切片
与列表切片规则一致,格式为arr[start:stop:step]:
arr = np.arange(10) # 生成[0,1,2,...,9]
print(arr[2:7]) # 从索引2到6(不包含7):[2 3 4 5 6]
print(arr[::2]) # 步长为2:[0 2 4 6 8]
2. 多维数组的切片
对于二维数组(矩阵),格式为arr[行切片, 列切片],用逗号分隔行和列:
arr = np.arange(15).reshape(5, 3) # 5行3列的数组
print(arr)
# 输出:
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]
# [12 13 14]]
print(arr[2, 1]) # 第3行第2列(索引从0开始):7
print(arr[1:4, :2]) # 第2-4行,第1-2列:
# [[ 3 4]
# [ 6 7]
# [ 9 10]]
3. 省略号(...)的使用
当数组维度较高时,可用...代表未指定的维度,简化切片操作
# 对于5行3列的数组,获取所有行的第2列
print(arr[..., 1]) # 输出:[ 1 4 7 10 13]
五、实战练习:巩固数组操作
通过几个小练习,检验对 NumPy 的掌握程度:
-
生成 3×3 的对角矩阵:
np.eye(3, dtype=int) -
创建长度为 10 的数组,值在 (0,1) 之间(不包含 0 和 1):
np.random.random(10) # random()生成[0,1)的随机数,排除0可加微小偏移 -
创建长度为 10 的全 0 数组,第 5 个元素为 1:
arr = np.zeros(10) arr[4] = 1 # 索引从0开始,第5个元素索引为4 -
生成 30 到 50、步长为 2 的数组:
np.arange(30, 51, 2)
小结
NumPy 的ndarray数组是科学计算的基础,它的高效性和灵活性远超 Python 列表。本文介绍了数组的创建方法、核心属性和切片操作,这些是后续学习数值计算、矩阵运算的前提。下一篇,我们将深入探讨 NumPy 的数学运算和广播机制,带你解锁更复杂的科学计算功能。掌握 NumPy,让你的数据处理效率提升一个量级!
更多推荐
所有评论(0)