一、为什么选择 NumPy?—— 超越 Python 列表的优势

Python 自带的列表(List)虽然灵活,但在处理大规模数值计算时效率低下。NumPy 的出现正是为了解决这一问题,它的核心优势包括:

  • 高效存储与计算:NumPy 的ndarray(N 维数组)是同类型元素的集合,存储更紧凑,计算时可利用 CPU 缓存加速,比列表快 10 倍以上;
  • 简化代码:支持向量化操作,无需循环即可对整个数组进行运算(如arr * 2直接实现数组中所有元素乘以 2);
  • 丰富的数学函数:内置大量线性代数、统计、随机数生成等函数,覆盖科学计算的核心需求。

例如,计算一个包含 1000 万个元素的列表总和,Python 列表需要 0.12 秒,而 NumPy 数组仅需 0.02 秒,效率提升显著。

二、环境准备:安装与导入

NumPy 不是 Python 标准库,需要手动安装:

  1. 安装命令(推荐使用清华镜像源加速):

    # 使用pip安装
    pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 或使用conda(适用于Anaconda环境)
    conda install numpy
    
  2. 导入方式
    惯例是将 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 元素的数据类型(如int32float64
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 的掌握程度:

  1. 生成 3×3 的对角矩阵

    np.eye(3, dtype=int)
    
  2. 创建长度为 10 的数组,值在 (0,1) 之间(不包含 0 和 1)

    np.random.random(10)  # random()生成[0,1)的随机数,排除0可加微小偏移
    
  3. 创建长度为 10 的全 0 数组,第 5 个元素为 1

    arr = np.zeros(10)
    arr[4] = 1  # 索引从0开始,第5个元素索引为4
    
  4. 生成 30 到 50、步长为 2 的数组

    np.arange(30, 51, 2)
    

小结

NumPy 的ndarray数组是科学计算的基础,它的高效性和灵活性远超 Python 列表。本文介绍了数组的创建方法、核心属性和切片操作,这些是后续学习数值计算、矩阵运算的前提。下一篇,我们将深入探讨 NumPy 的数学运算和广播机制,带你解锁更复杂的科学计算功能。掌握 NumPy,让你的数据处理效率提升一个量级!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐