文章目录

NumPy(Numerical Python)是Python中用于科学计算的核心库,提供了高性能的多维数组对象(ndarray)以及用于处理这些数组的丰富函数集。它是数据分析、机器学习、科学计算等领域的基础,比Python原生列表更高效(尤其处理大规模数据时),并支持向量化运算。

一、NumPy核心概念:ndarray

ndarray(N-dimensional array,N维数组)是NumPy的核心数据结构,具有以下特点:

  • 同质性:数组中所有元素必须是同一数据类型(如整数、浮点数)。
  • 固定大小:创建后形状(维度)固定,修改形状需通过特定方法(如reshape)。
  • 高效性:存储在连续内存块中,运算速度远快于Python列表。

二、ndarray的基本属性

创建数组后,可通过以下属性查看其特征:

  • ndim:数组的维度(秩)。
  • shape:数组的形状(各维度大小的元组)。
  • dtype:数组元素的数据类型(如int32float64)。
  • size:数组元素的总个数(shape各元素乘积)。
  • itemsize:每个元素的字节大小。

三、NumPy的基本使用

1. 安装与导入
pip install numpy  # 安装
import numpy as np  # 导入(通常简写为np)
2. 数组的创建

常用创建方法:

函数 功能
np.array() 从Python列表/元组创建数组
np.zeros() 创建全0数组
np.ones() 创建全1数组
np.arange() 类似range,创建有序数组
np.linspace() 创建指定范围内的等间隔数组
np.random.rand() 创建0-1随机数组
np.eye() 创建单位矩阵(对角线为1,其余为0)

示例代码

import numpy as np

# 1. 从列表创建数组
arr1 = np.array([1, 2, 3, 4])  # 一维数组
arr2 = np.array([[1, 2], [3, 4]])  # 二维数组(矩阵)
print("arr1:", arr1)  # [1 2 3 4]
print("arr2:\n", arr2)  # [[1 2] [3 4]]

# 2. 创建特殊数组
zeros = np.zeros((2, 3))  # 2行3列全0数组
ones = np.ones((3, 2))    # 3行2列全1数组
arange = np.arange(0, 10, 2)  # 0到10(不含),步长2:[0 2 4 6 8]
linspace = np.linspace(0, 1, 5)  # 0到1(含),5个等间隔值:[0.  0.25 0.5  0.75 1.  ]
rand = np.random.rand(2, 2)  # 2x2随机数组(0-1)
eye = np.eye(3)  # 3x3单位矩阵

# 查看属性
print("arr2维度:", arr2.ndim)  # 2
print("arr2形状:", arr2.shape)  # (2, 2)
print("arr2数据类型:", arr2.dtype)  # int64(默认)
print("arr2元素总数:", arr2.size)  # 4
3. 数组形状操作

常用方法:

  • reshape():修改数组形状(不改变数据,返回新数组)。
  • flatten():将多维数组展平为一维数组。
  • transpose():转置数组(行列互换)。

示例代码

import numpy as np

arr = np.arange(12)  # [ 0  1  2 ... 11]
print("原数组形状:", arr.shape)  # (12,)

# 重塑为3行4列
reshaped = arr.reshape(3, 4)
print("重塑后形状:", reshaped.shape)  # (3, 4)
print("重塑后数组:\n", reshaped)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 展平为一维
flattened = reshaped.flatten()
print("展平后:", flattened)  # [ 0  1  2 ... 11]

# 转置(3x4 → 4x3)
transposed = reshaped.transpose()
print("转置后形状:", transposed.shape)  # (4, 3)
4. 数组索引与切片

与Python列表类似,但支持多维索引:

  • 一维数组:arr[index]arr[start:end:step]
  • 二维数组:arr[row_index, col_index]arr[row_slice, col_slice]

示例代码

import numpy as np

# 一维数组索引
arr1d = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
print("索引第3个元素:", arr1d[2])  # 2(索引从0开始)
print("切片2-5(不含5):", arr1d[2:5])  # [2 3 4]

# 二维数组索引
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("第2行第3列元素:", arr2d[1, 2])  # 6(行索引1,列索引2)
print("第1行所有元素:", arr2d[0, :])  # [1 2 3]
print("前2行,后2列:\n", arr2d[:2, 1:])
# [[2 3]
#  [5 6]]
5. 数组运算

NumPy支持向量化运算(无需循环,直接对整个数组操作),效率极高。

运算类型 示例
元素级运算 +-*/**(平方)
矩阵运算 np.dot(a, b)a @ b(矩阵乘法)
比较运算 ><==(返回布尔数组)

示例代码

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 元素级运算
print("a + b:", a + b)  # [5 7 9]
print("a * b:", a * b)  # [4 10 18]
print("a的平方:", a **2)  # [1 4 9]

# 矩阵乘法(需满足维度兼容:a的列数 = b的行数)
mat1 = np.array([[1, 2], [3, 4]])  # 2x2
mat2 = np.array([[5, 6], [7, 8]])  # 2x2
print("矩阵乘法:\n", mat1 @ mat2)  # 等价于np.dot(mat1, mat2)
# [[19 22]
#  [43 50]]

# 比较运算
print("a > 2:", a > 2)  # [False False  True]
6. 广播机制(Broadcasting)

当两个数组形状不同时,NumPy会自动扩展其中一个或两个数组,使它们形状兼容后再运算(无需手动扩展)。

示例代码

import numpy as np

# 标量与数组运算(标量被广播为数组形状)
a = np.array([1, 2, 3])
print("a + 10:", a + 10)  # [11 12 13]

# 不同形状数组运算(自动广播)
b = np.array([[1, 2, 3], [4, 5, 6]])  # 2x3
c = np.array([10, 20, 30])  # 1x3(被广播为2x3)
print("b + c:\n", b + c)
# [[11 22 33]
#  [14 25 36]]
7. 统计函数

NumPy提供了丰富的统计函数,用于快速计算数组的统计特征:

函数 功能
np.mean() 平均值
np.median() 中位数
np.sum() 总和
np.max() / np.min() 最大值/最小值
np.std() / np.var() 标准差/方差

示例代码

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print("平均值:", np.mean(arr))  # 5.0
print("每行平均值:", np.mean(arr, axis=1))  # [2. 5. 8.](axis=1表示按行计算)
print("总和:", np.sum(arr))  # 45
print("最大值:", np.max(arr))  # 9
print("标准差:", np.std(arr))  # 2.581988897471611
8. 文件操作

NumPy支持将数组保存到文件或从文件加载,常用格式为.npy(二进制)。

示例代码

import numpy as np

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

# 保存数组到文件
np.save("my_array.npy", arr)

# 从文件加载数组
loaded_arr = np.load("my_array.npy")
print("加载的数组:", loaded_arr)  # [1 2 3 4]

四、NumPy的应用场景

  • 数据分析:与Pandas配合处理结构化数据。
  • 机器学习:作为Scikit-learn、TensorFlow等库的底层数据结构。
  • 科学计算:解决线性代数、傅里叶变换等问题。
  • 图像处理:表示图像像素矩阵并进行处理。

总结

NumPy通过ndarray提供了高效的多维数组操作能力,是Python科学计算的基石。其核心优势在于向量化运算和广播机制,大幅提升了数据处理效率。掌握NumPy是学习数据分析、机器学习等领域的必备基础。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐