一、什么是Numpy?

在Python的数值计算世界里,Numpy是一个核心库。它提供了高性能的多维数组对象,以及一系列用于处理这些数组的工具。相比Python原生的列表,Numpy数组能更高效地进行数值运算,尤其适合数据科学、机器学习、科学计算等场景。如果你接触过Excel表格、矩阵运算,或者想处理大量数据,Numpy会是你的得力助手。

二、安装与导入

首先,确保你安装了Numpy。如果还没安装,可以用pip命令:

pip install numpy

在代码中导入Numpy(通常简写为np):

import numpy as np

三、创建Numpy数组

Numpy数组是处理数据的基本单位,我们先看看如何创建数组。

1. 从Python列表创建数组

最简单的方式是用np.array(),传入一个列表即可生成数组:

# 一维数组
arr1 = np.array([1, 2, 3, 4])
print(arr1)  # 输出:[1 2 3 4]

# 二维数组(列表的列表)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 输出:
# [[1 2 3]
#  [4 5 6]]

2. 使用Numpy内置函数创建数组

Numpy提供了很多快捷函数,适合生成特定结构的数组:

  • 全0数组np.zeros(shape, dtype=float)
  zeros_arr = np.zeros((3, 4))  # 形状为(3,4)的全0数组
  print(zeros_arr)
  # 输出:
  # [[0. 0. 0. 0.]
  #  [0. 0. 0. 0.]
  #  [0. 0. 0. 0.]]
  • 全1数组np.ones(shape, dtype=float)
  ones_arr = np.ones((2, 2))  # 形状为(2,2)的全1数组
  print(ones_arr)
  # 输出:
  # [[1. 1.]
  #  [1. 1.]]
  • 等差数列np.arange(start, end, step)(类似Python的range)
  arange_arr = np.arange(0, 10, 2)  # 从0开始,步长2,到10结束(不包含10)
  print(arange_arr)  # 输出:[0 2 4 6 8]
  • 均匀分布数组np.linspace(start, end, num)(生成num个均匀分布的数)
  linspace_arr = np.linspace(0, 10, 5)  # 生成5个数,从0到10均匀分布
  print(linspace_arr)  # 输出:[ 0.   2.5  5.   7.5 10. ]
  • 随机数组np.random系列函数(如正态分布、均匀分布)
  # 生成3x3的标准正态分布随机数组(均值0,标准差1)
  rand_arr = np.random.randn(3, 3)
  print(rand_arr)

四、数组的基础属性

了解数组的属性能帮你快速掌握它的结构。常见属性有:

  • shape:数组的形状(维度)
  • ndim:数组的维度数量
  • dtype:数组元素的数据类型
  • size:数组元素的总数

示例:

arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)  # 指定数据类型为整数
print("形状:", arr.shape)   # 输出:(2, 3)(2行3列)
print("维度:", arr.ndim)    # 输出:2(二维数组)
print("数据类型:", arr.dtype)  # 输出:int32
print("元素总数:", arr.size)   # 输出:6(2×3=6)

五、数组的索引与切片

数组的索引和切片是访问元素的核心操作,类似Python列表但更灵活。

1. 一维数组

arr = np.array([1, 3, 5, 7, 9])
print(arr[0])    # 访问第一个元素:1
print(arr[-1])   # 访问最后一个元素:9
print(arr[1:4])  # 切片:从索引1到4(不包含4):[3, 5, 7]

2. 二维数组

二维数组可以理解为“表格”,用逗号分隔行和列的索引:

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1])   # 第0行第1列:2
print(arr[1, :])   # 第1行所有列:[4 5 6]
print(arr[:, 2])   # 所有行第2列:[3 6 9]
print(arr[0:2, 1:3])  # 切片:前2行,后2列(左闭右开)
# 输出:
# [[2 3]
#  [5 6]]

3. 布尔索引(按条件筛选)

用布尔数组作为索引,筛选出满足条件的元素:

arr = np.array([1, 3, 5, 7, 9])
mask = arr > 3  # 生成布尔数组:[False, False, True, True, True]
print(arr[mask])  # 输出:[5 7 9](筛选出大于3的元素)

六、数组的基础运算

Numpy数组支持高效的元素级运算和矩阵运算,比Python列表的运算更简洁。

1. 算术运算(元素级操作)

Numpy数组的算术运算符(+, -, *, /等)是元素级的,即每个元素独立运算:

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

print(arr1 + arr2)  # 元素相加:[5, 7, 9]
print(arr1 * arr2)  # 元素相乘:[4, 10, 18]
print(arr1 / arr2)  # 元素相除:[0.25, 0.4, 0.5]

⚠️ 注意:Python列表的+拼接(如[1,2]+[3,4]=[1,2,3,4]),而Numpy数组的+元素相加

2. 矩阵运算(线性代数)

  • 矩阵乘法:用np.dot()@运算符(对应数学中的矩阵乘法)
  A = np.array([[1, 2], [3, 4]])  # 2x2矩阵
  B = np.array([[5, 6], [7, 8]])  # 2x2矩阵
  C = A @ B  # 矩阵乘法:A×B
  print(C)
  # 输出:
  # [[19 22]
  #  [43 50]]
  • 点积np.dot(a, b)计算两个向量的点积(标量)
  v1 = np.array([1, 2, 3])
  v2 = np.array([4, 5, 6])
  print(np.dot(v1, v2))  # 1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32

3. 广播机制(不同形状数组的运算)

当运算的数组形状不同时,Numpy会自动“广播”(扩展)小数组以匹配大数组合法运算。常见场景:
- 数组与标量运算:标量会自动扩展到数组的每个元素

  arr = np.array([1, 2, 3])
  print(arr + 2)  # 每个元素加2:[3, 4, 5]
  • 形状兼容的数组:维度为1的轴会被扩展
  arr1 = np.array([[1, 2, 3], [4, 5, 6]])  # 2x3数组
  arr2 = np.array([10, 20, 30])           # 1x3数组(等价于[10,20,30])
  print(arr1 + arr2)  # 每行分别加arr2:
  # [[11 22 33]
  #  [14 25 36]]

七、简单应用示例

1. 数组统计分析

Numpy内置了大量统计函数,快速计算数组的关键指标:

arr = np.array([1, 2, 3, 4, 5])
print("总和:", arr.sum())      # 15
print("均值:", arr.mean())     # 3.0
print("标准差:", arr.std())    # 1.4142...
print("最大值:", arr.max())    # 5
print("最小值:", arr.min())    # 1

2. 数据筛选与处理

结合索引和布尔运算,快速筛选异常值:

data = np.array([10, 5, 20, 8, 15])
# 筛选出大于10的元素
filtered = data[data > 10]
print(filtered)  # 输出:[10, 20, 15](注意:10也大于10,包含在内)

八、总结与练习

Numpy是Python数值计算的基石,掌握它能极大提升数据处理效率。关键知识点回顾:
- 数组创建:从列表、zeros/ones/arange/linspace等
- 数组属性:shape、ndim、dtype、size
- 索引切片:一维/二维数组、布尔索引
- 基础运算:元素级算术、矩阵乘法、广播机制

练习建议
1. 尝试生成不同形状的随机数组,并计算其均值、方差
2. 用Numpy实现简单的矩阵乘法(3x3矩阵×3x2矩阵)
3. 对二维数组进行切片,提取子矩阵并计算和

通过以上内容,你已经能初步掌握Numpy的基础操作。后续可以探索更高级的功能,如线性代数、傅里叶变换等,进一步提升数值计算能力!

小夜