Numpy 基础
- Numpy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算。
- 安装 NumPy 最简单的方法就是使用 pip 工具: pip install numpy
- Numpy常用的导入格式:import numpy as np
一、创建数组对象
- 定义:在NumPy中,数组对象是一个多维的、同质的数值容器,称为 ndarray 对象。
- 创建数组:可以通过 numpy.array() 函数从Python列表或元组创建数组。
- array() 函数的格式为:
numpy.array(object, dtype = None, ndmin = None)
object :对象
dtype :数据类型,可选
ndmin :整数,指定生成数组的最小维度。
创建数组
import numpy as np # 从列表创建数组 arr = np.array([1, 2, 3, 4]) # 一维数组 arr2 = np.array([[1, 2], [3, 4]]) # 二维数组
使用函数创建数组
import numpy as np zeros_arr = np.zeros((3, 4)) # 3行4列的全零数组 ones_arr = np.ones((2, 3)) # 2行3列的全1数组 empty_arr = np.empty((2, 2)) # 创建空数组(内容随机) arange_arr = np.arange(0, 10, 2) # 从0到10(不包括10),步长为2 linspace_arr = np.linspace(0, 10, 5) # 在0到10之间生成5个等间距的数
二、数组的属性 (arr
是某个数组的变量名)
- 形状:
arr.shape
# 返回数组的维度,以元组类型输出
- 维度:
arr.ndim
# 返回数组的维度数
- 数据类型:
arr.dtype
# 返回数组中元素的数据类型
- 大小:
arr.size
# 返回数组中元素的总数
三、数组的索引与切片
一维数组
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[0]) # 第一个元素:10
print(arr[-1]) # 最后一个元素:50
print(arr[1:4]) # 切片:20, 30, 40(左闭右开,不包含索引4)
print(arr[::2]) # 步长2:10, 30, 50(从0开始)
print(arr[1::2]) # 从索引1开始,步长2: 20, 40
多维数组
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 访问单个元素:行索引0,列索引2 → 3
print(arr[0, 2]) # 3
# 切片:取前两行,中间一列(列索引1)
print(arr[:2, 1]) # [2 5]
# 取所有行,第0和2列(注意用列表指定列)
print(arr[:, [0, 2]])
# 输出:
# [[1 3]
# [4 6]
# [7 9]]
布尔索引(关键:用布尔数组筛选元素)
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
mask = arr > 25 # 生成布尔数组:[False, False, True, True, True]
print(arr[mask]) # [30 40 50]
# 复杂条件:同时满足>20且<50
print(arr[(arr > 20) & (arr < 50)]) # [30 40](注意用&而非and)
花式索引(用整数数组指定索引)
import numpy as np
arr = np.array([[1, 2], [3, 4], [5, 6]])
rows = np.array([0, 2, 1]) # 行索引
cols = np.array([1, 0, 1]) # 列索引
print(arr[rows, cols]) # 按坐标(0,1),(2,0),(1,1)取值 → [2, 5, 4]
四、数组运算
算数运算(逐元素运算,无需循环)
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9](对应元素相加)
# 二维矩阵乘法(需区分逐元素乘和矩阵乘)
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A * B)
# 逐元素乘(Hadamard积):
# [[ 5 12]
# [21 32]]
print(A @ B)
# 矩阵乘法(等价于np.dot(A, B)):
# [[19 22]
# [43 50]]
广播机制(自动扩展维度适配运算)
import numpy as np
# 一维数组与标量运算(标量视为形状(1,)的数组)
arr = np.array([1, 2, 3])
print(arr + 5) # [6 7 8](广播5为[5,5,5])
# 二维数组与一维数组运算(列方向对齐)
matrix = np.array([[1, 2, 3], [4, 5, 6]])
vector = np.array([10, 20, 30])
print(matrix + vector)
# 逐行加vector:
# [[11 22 33]
# [14 25 36]]
比较运算(返回布尔数组)
import numpy as np
arr = np.array([10, 20, 30, 40])
print(arr > 25) # [False False True True]
print(arr == 20) # [False True False False]
聚合函数(对数组元素进行统计)
import numpy as np
# 按轴聚合(以二维数组为例,axis=0为列,axis=1为行)
matrix = np.array([[1, 2], [3, 4]])
print(np.sum(matrix, axis=0)) # 列求和:[4, 6]
print(np.mean(matrix, axis=1)) # 行平均:[1.5, 3.5]
示例: arr=np.array ([1,3,5,7])
函数 | 说明 | 结果 |
---|---|---|
np.sum() | 求和 | 16 |
np.mean() | 平均值 | 4 |
np.max() | 最大值 | 7 |
np.min() | 最小值 | 1 |
np.std() | 标准差 | 2.5819889 |
np.argmax() | 最大值索引 | 3 |
五、数组变形与维度操作
改变形状(不改变数据,返回新数组)
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
# 转为2行3列
reshaped_arr = arr.reshape((2, 3))
print(reshaped_arr)
# [[1 2 3]
# [4 5 6]]
# 自动计算维度(-1表示自动推导)
auto_arr = arr.reshape((-1, 2)) # 3行2列(6/2=3)
展平数组(一维化)
import numpy as np
arr = np.array([[1, 2], [3, 4]])
flat_arr1 = arr.ravel() # 展平,返回视图(与原数组共享数据)
flat_arr2 = arr.flatten() # 展平,返回拷贝到新变量中(独立数据)
调整维度(增加 / 减少维度)
import numpy as np
arr = np.array([1, 2, 3])
# 增加维度:转为列向量(形状(3,1))
col_vec = arr[:, np.newaxis] # 等价于np.expand_dims(arr, axis=1)
# 减少维度:移除大小为1的维度
arr_3d = np.array([[[1], [2]]])
squeezed_arr = arr_3d.squeeze() # 转为[1, 2](形状从(1,2,1)变为(2,))
转置(交换轴,常用于矩阵转置)
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6]])
transposed = matrix.T # 转置,形状从(2,3)变为(3,2)
六、数组拼接与分割
拼接数组(concatenate,可指定轴)
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 按行拼接(axis=0,等价于vstack)
row_concat = np.concatenate((a, b), axis=0)
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
# 按列拼接(axis=1,等价于hstack)
col_concat = np.concatenate((a, b), axis=1)
# [[1 2 5 6]
# [3 4 7 8]]
分割数组(split,指定轴和分割点)
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
# 按行平均分割为2部分(axis=0)
split_rows = np.split(arr, 2, axis=0)
# [array([[1, 2, 3],
# [4, 5, 6]]),
# array([[ 7, 8, 9],
# [10, 11, 12]])]
# 按列指定位置分割(分割点[1,2],分成3部分)
split_cols = np.split(arr, [1, 2], axis=1)
# [array([[ 1],
# [ 4],
# [ 7],
# [10]]),
# array([[ 2],
# [ 5],
# [ 8],
# [11]]),
# array([[ 3],
# [ 6],
# [ 9],
# [12]])]
七、随机数生成:数据模拟必备
常用随机数函数
函数 | 说明 | 示例 |
---|---|---|
np.random.rand() | 生成 [0, 1) 区间内的均匀分布随机数,形状由参数指定 | np.random.rand(2, 3) → 生成形状为 (2, 3) 的二维数组(元素在 0~1 之间) |
np.random.randn() | 生成标准正态分布(均值 0,标准差 1)的随机数 | np.random.randn(5) → 生成包含 5 个服从 N(0, 1) 分布的一维数组 |
np.random.randint(low, high=None, size=None) | 生成 [low, high) 区间内的随机整数,形状由 size 指定 | np.random.randint(1, 10, size=(2, 2)) → 生成 2×2 数组,元素在 1~9 之间 |
设定随机种子(作用:保证结果固定)
np.random.seed(42) # 固定种子,后续随机数相同
rand_arr = np.random.rand(3) # 每次运行结果一致