python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python NumPy库核心知识

Python中NumPy库的核心知识总结大全

作者:shasha225_

NumPy是Python编程语言中一个开源的数值计算扩展库,它为Python提供了高性能的多维数组对象以及一系列用于处理这些数组的数学函数,是科学计算、数据分析等领域的基础工具之一,这篇文章主要介绍了Python中NumPy库的核心知识总结大全,需要的朋友可以参考下

一、核心对象:ndarray(N维数组)

1.1 定义与特点

1.2 核心属性

属性描述示例(arr = np.array([[1,2],[3,4]]))
shape数组维度的元组,格式为 (维度1大小, 维度2大小, ...)(2, 2)(2 行 2 列)
dtype元素的数据类型(如 int32float64int64(默认整数类型)
ndim数组的维度数(秩)2(二维数组)
size数组元素的总个数(shape 各元素乘积)4(2×2)
itemsize单个元素的字节大小8int64 占 8 字节)
nbytes数组总字节大小(size × itemsize32(4×8)
data指向数组数据的缓冲区(一般不直接使用)内存地址指针

示例

import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)   # (2, 3)
print(arr.dtype)   # int64
print(arr.ndim)    # 2
print(arr.size)    # 6

二、数组创建方法

2.1 从 Python 序列创建

示例

# 1维数组
arr1 = np.array([1, 2, 3, 4])
# 2维数组(列表嵌套列表)
arr2 = np.array([[1, 2], [3, 4]], dtype=np.float32)  # 指定为32位浮点数
# 强制为3维数组(即使输入是2维)
arr3 = np.array([[1, 2], [3, 4]], ndmin=3)  # shape 为 (1, 2, 2)

2.2 创建特殊数组

函数描述示例
np.zeros(shape)创建全 0 数组np.zeros((2,3)) → 2 行 3 列全 0 数组
np.ones(shape)创建全 1 数组np.ones(5) → 1 维 5 元素全 1 数组
np.full(shape, val)创建填充指定值 val 的数组np.full((2,2), 10) → 2×2 全 10 数组
np.empty(shape)创建未初始化数组(值为内存随机值,速度快)np.empty((3,3))
np.arange(start, stop, step)生成整数序列(类似 range,但返回数组),start 默认为 0,step默认为 1np.arange(1, 10, 2) → [1,3,5,7,9]
np.linspace(start, stop, num)生成 num 个等间隔的数(包含 start 和 stopnp.linspace(0, 1, 5) → [0,0.25,0.5,0.75,1]
np.eye(n, k=0)创建 n×n 单位矩阵(对角线为 1,其余为 0),k 控制对角线偏移(正上负下)np.eye(3, k=1) → 上对角线为 1
np.diag(arr)从 1 维数组创建对角矩阵,或从多维数组提取对角线np.diag([1,2,3]) → 3×3 对角矩阵

2.3 随机数组(np.random模块)

函数描述
np.random.rand(d0, d1, ...)生成 [0,1) 均匀分布的随机数数组
np.random.randn(d0, d1, ...)生成标准正态分布(均值 0,方差 1)的随机数数组
np.random.randint(low, high, size)生成 [low, high) 范围内的随机整数数组
np.random.choice(arr, size)从 arr 中随机采样生成数组
np.random.shuffle(arr)原地打乱数组顺序(仅对第一维有效)

示例

np.random.rand(2, 3)  # 2行3列 [0,1) 随机数
np.random.randint(1, 10, size=(3,))  # 1维3元素,值在1~9之间

三、数组操作(维度与形态)

3.1 维度调整

arr = np.arange(12)  # shape (12,)
arr_reshape = arr.reshape(3, 4)  # shape (3,4),元素不变
arr = np.array([[1,2],[3,4]])
arr_flat = arr.flatten()  # 副本
arr_rav = arr.ravel()     # 视图
arr = np.array([1,2,3])  # shape (3,)
arr_2d = arr[np.newaxis, :]  # shape (1,3)(行向量)
arr_2d_col = arr[:, np.newaxis]  # shape (3,1)(列向量)

3.2 数组拼接

示例

a = np.array([[1,2], [3,4]])  # shape (2,2)
b = np.array([[5,6], [7,8]])  # shape (2,2)
np.concatenate([a, b], axis=0)  # 垂直拼接 → shape (4,2)
np.hstack([a, b])  # 水平拼接 → shape (2,4)

3.3 数组分割

示例

arr = np.arange(12).reshape(3,4)  # shape (3,4)
# 按索引分割(axis=0,行方向)
np.split(arr, [1,3], axis=0)  # 分割为 [0:1行, 1:3行]
# 平均分成2份(axis=1,列方向)
np.hsplit(arr, 2)  # 分割为 [0:2列, 2:4列]

3.4 转置与轴交换

arr = np.arange(8).reshape(2,2,2)  # shape (2,2,2)
arr_trans = arr.transpose(1,0,2)  # 交换0轴和1轴,新shape (2,2,2)

四、索引与切片(元素访问)

NumPy 支持多种索引方式,用于精准访问数组元素。

4.1 基本索引(单元素访问)

示例

arr = np.array([[1,2,3], [4,5,6], [7,8,9]])  # 3×3数组
print(arr[0, 1])  # 第0行第1列 → 2
print(arr[2, -1])  # 第2行最后一列 → 9

4.2 切片(范围访问)

示例

arr = np.arange(12).reshape(3,4)  # 3行4列:[[0,1,2,3],[4,5,6,7],[8,9,10,11]]
# 取第1行(索引0)的第1到第3列(不包含3)
print(arr[0, 1:3])  # [1,2]
# 取第0到第2行(不包含2)的所有列
print(arr[0:2, :])  # [[0,1,2,3], [4,5,6,7]]
# 每隔1行取1行,每隔2列取1列
print(arr[::2, ::2])  # [[0,2], [8,10]]

4.3 布尔索引(条件筛选)

示例

arr = np.array([[1,2,3], [4,5,6], [7,8,9]])
# 筛选大于5的元素
mask = arr > 5  # 布尔数组:[[False,False,False], [False,False,True], [True,True,True]]
print(arr[mask])  # [6,7,8,9]
# 复合条件(需用 & 连接,而非 and)
print(arr[(arr > 3) & (arr < 8)])  # [4,5,6,7]

4.4 花式索引(指定位置访问)

示例

arr = np.array([10, 20, 30, 40, 50])
# 1维数组:取索引0, 2, 4的元素
print(arr[[0, 2, 4]])  # [10,30,50]
 
# 2维数组:取 (0,1)、(2,3) 位置的元素
arr2d = np.arange(12).reshape(3,4)
print(arr2d[[0,2], [1,3]])  # [1, 11]

注意

五、广播机制(Broadcasting)

广播是 NumPy 中不同形状数组进行算术运算的核心机制,无需手动扩展数组维度。

5.1 广播规则

  1. 维度对齐:若两个数组维度不同,在形状较短的数组前补 1,直到维度数相同。
    • 例:shape (2,3) 与 shape (3,) → 补 1 后为 (2,3) 与 (1,3)
  2. 维度兼容:对于对齐后的每个维度,若大小相同,或其中一个为 1,则兼容;否则报错。
    • 兼容示例:(2,3) 与 (1,3) → 第 0 维 2 vs 1(兼容),第 1 维 3 vs 3(兼容)。
    • 不兼容示例:(2,3) 与 (2,4) → 第 1 维 3 vs 4(不兼容,报错)。
  3. 扩展维度:兼容的维度中,大小为 1 的维度会被扩展为与另一个数组相同的大小(虚拟扩展,不占用内存)。

5.2 广播示例

# 示例1:1维数组与标量广播
a = np.array([1, 2, 3])
b = 2
print(a + b)  # [3,4,5](b 广播为 [2,2,2])
 
# 示例2:2维数组与1维数组广播
a = np.array([[1,2,3], [4,5,6]])  # shape (2,3)
b = np.array([10, 20, 30])        # shape (3,) → 广播为 (1,3) → 再扩展为 (2,3)
print(a + b)  # [[11,22,33], [14,25,36]]
 
# 示例3:高维广播
a = np.ones((2, 1, 3))  # shape (2,1,3)
b = np.ones((1, 2, 3))  # shape (1,2,3)
# 对齐维度后:(2,1,3) 与 (1,2,3) → 扩展为 (2,2,3)
print((a + b).shape)  # (2,2,3)

六、数学运算

6.1 元素级运算

支持 +-*/**(幂)、%(取模)等运算符,或对应的函数(如 np.add)。

示例

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)  # [5,7,9](元素相加)
print(a * b)  # [4,10,18](元素相乘)
print(a **2)  # [1,4,9](元素平方)
print(np.subtract(b, a))  # [3,3,3](等价于 b - a)

6.2 聚合函数(沿轴运算)

对数组沿指定轴(axis)进行统计或聚合,返回标量或降维数组。

函数描述示例(arr = np.array([[1,2],[3,4]]))
np.sum(arr, axis)求和np.sum(arr, axis=0) → [4,6](按列求和)
np.mean(arr, axis)均值np.mean(arr) → 2.5(全局均值)
np.median(arr, axis)中位数np.median(arr, axis=1) → [1.5, 3.5](按行求中位数)
np.max(arr, axis) / np.min(arr, axis)最大 / 最小值np.max(arr, axis=0) → [3,4]
np.std(arr, axis) / np.var(arr, axis)标准差 / 方差np.std(arr) → ~1.118
np.cumsum(arr, axis)累积和np.cumsum(arr) → [1,3,6,10]

注意axis 不指定时,默认对全局所有元素运算。

6.3 矩阵运算

-** 矩阵乘法 **:np.dot(a, b) 或 a @ b(要求 a 的列数 = b 的行数)。

a = np.array([[1,2], [3,4]])  # 2×2矩阵
b = np.array([[5,6], [7,8]])  # 2×2矩阵
print(a @ b)  # 等价于 np.dot(a,b) → [[19,22], [43,50]]

-** 矩阵转置 :a.T(行变列,列变行)。

- 其他矩阵函数 **:np.linalg.inv(a)(矩阵求逆)、np.linalg.det(a)(行列式)、np.linalg.eig(a)(特征值和特征向量)等。

七、数据类型(dtype)与转换

7.1 常用数据类型

NumPy 支持比 Python 更多的数据类型,常见类型如下:

类型描述示例
int8/int16/int32/int64有符号整数(8/16/32/64 位)np.int32
uint8/uint16...无符号整数(仅正整数)np.uint8
float16/float32/float64浮点数(精度递增)np.float64(默认)
complex64/complex128复数(实部 + 虚部)np.complex128
bool布尔值(True/False)np.bool_
string_字符串(固定长度)np.string_

7.2 数据类型转换

示例

arr = np.array([1, 2, 3], dtype=np.int32)
arr_float = arr.astype(np.float64)  # 转为float64 → [1. 2. 3.]
arr_str = arr.astype(np.string_)    # 转为字符串 → [b'1' b'2' b'3']

总结 

到此这篇关于Python中NumPy库核心知识总结大全的文章就介绍到这了,更多相关Python NumPy库核心知识内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文