当前位置:首页 > 技术 > 正文内容

Numpy核心知识详解

访客 技术 2026年7月5日 1

为何选择Numpy

Numpy的核心功能是提供高效的多维数组对象ndarray及配套的操作函数库。

相较于Python内置列表,其主要优势包括:

  • 高效性:底层采用C语言实现,规避了Python循环带来的性能损耗
  • 功能性:封装了丰富的数值计算方法
  • 简洁性:能够以较少代码完成复杂的数据操作

1. Numpy基础:ndarray对象

1.1 构建数组

import numpy as np

# 基于列表构造
data_list = [10, 20, 30, 40]
vector = np.array(data_list)
print("一维向量:", vector)

nested_list = [[1, 2], [3, 4]]
matrix = np.array(nested_list)
print("二维矩阵:\n", matrix)

# 特殊数组生成
zero_matrix = np.zeros((2, 3))        # 全零矩阵
unit_matrix = np.ones((3, 2))         # 全一矩阵
uninit_matrix = np.empty((2, 2))      # 未初始化矩阵
fill_matrix = np.full((2, 2), 5)      # 指定值填充矩阵

# 序列数组创建
step_array = np.arange(1, 10, 2)      # 步长数组 [1, 3, 5, 7, 9]
linear_array = np.linspace(0, 2, 5)   # 等间距数组 [0., 0.5, 1., 1.5, 2.]

# 单位矩阵
identity = np.eye(3)
print("单位矩阵:\n", identity)

# 随机数组生成
uniform_random = np.random.rand(2, 2)       # 均匀分布随机数
normal_random = np.random.randn(2, 2)       # 正态分布随机数
integer_random = np.random.randint(1, 6, (2, 2)) # 整数随机数

1.2 数组特征信息

tensor = np.random.randn(2, 3, 4)

print("维度数:", tensor.ndim)     # 3
print("结构形状:", tensor.shape)   # (2, 3, 4)
print("元素总量:", tensor.size)    # 24
print("数据类型:", tensor.dtype)   # float64

2. 数组基本操作

2.1 数据访问与筛选

sample = np.array([[11, 12, 13, 14],
                   [21, 22, 23, 24],
                   [31, 32, 33, 34]])

# 行列定位
print("首行数据:", sample[0])           # [11 12 13 14]
print("第二行第三列:", sample[1, 2])     # 23

# 区间切片
print("前两行:\n", sample[:2])
print("前两行最后两列:\n", sample[:2, 2:])
print("各行列二:\n", sample[:, 1])       # [12, 22, 32]

# 条件过滤(关键特性)
print("大于20的元素:", sample[sample > 20])
sample[sample > 20] = -1               # 替换符合条件元素
print("更新后矩阵:\n", sample)

2.2 结构变换

seq = np.arange(12)
print("原序列:", seq)

# 改变维度
reshaped = seq.reshape(4, 3)
print("重构为4x3:\n", reshaped)

# 降维处理
flattened = reshaped.flatten()
print("扁平化结果:", flattened)

# 矩阵转置
transposed = reshaped.T
print("转置矩阵:\n", transposed)

3. 数值计算机制

3.1 基础运算

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

print("x + y =", x + y)    # [ 3  7 11 15]
print("x - y =", x - y)    # [1 1 1 1]
print("x * y =", x * y)    # [ 2 12 30 56] 元素相乘
print("x / y =", x / y)    # [2. 1.33.. 1.2 1.14..]
print("x ^ 2 =", x ** 2)   # [ 4 16 36 64]

3.2 广播原理

当参与运算的数组维度不一致时,Numpy会自动扩展较小数组以匹配较大数组。

广播准则
1. 从末尾维度开始对比
2. 若某维度长度相同或为1则可广播
3. 其余维度必须完全一致
# 标量广播示例
base = np.ones((2, 3))
outcome = base + 10
print("矩阵加常数:\n", outcome)

# 异形数组运算
row_vector = np.array([[1], [2], [3]])   # (3, 1)
col_vector = np.array([10, 20, 30])      # (3,)
# row_vector 扩展为 [[1,1,1],[2,2,2],[3,3,3]]
# col_vector 扩展为 [[10,20,30],[10,20,30],[10,20,30]]
print("行列向量相加:\n", row_vector + col_vector)

4. 通用函数应用

通用函数(ufunc)是对数组逐元素执行的函数,极大提升了计算效率。

elements = np.array([-2, -1, 0, 1])

# 数值函数
print("绝对值:", np.abs(elements))
print("平方根:", np.sqrt(np.abs(elements)))
print("自然指数:", np.exp(elements))
print("对数运算:", np.log(elements + 3))

# 三角函数
radians = np.array([0, np.pi/4, np.pi/2])
print("正弦值:", np.sin(radians))

# 统计分析
dataset = np.random.randn(4)
print("样本数据:", dataset)
print("总和:", np.sum(dataset))
print("平均值:", np.mean(dataset))
print("标准差:", np.std(dataset))
print("最大值:", np.max(dataset))
print("最小值位置:", np.argmin(dataset))

# 多维统计(指定维度)
grid = np.array([[1, 2], [3, 4], [5, 6]])
print("列方向求和:", np.sum(grid, axis=0))  # [9, 12]
print("行方向求和:", np.sum(grid, axis=1))  # [3, 7, 11]

5. 数组组合与拆分

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

# 合并操作
print("纵向合并:\n", np.vstack((block_a, block_b)))
print("横向合并:\n", np.hstack((block_a, block_b)))
print("axis=0合并:\n", np.concatenate((block_a, block_b), axis=0))
print("axis=1合并:\n", np.concatenate((block_a, block_b), axis=1))

# 分解操作
source = np.arange(12).reshape(3, 4)
print("源矩阵:\n", source)
parts = np.split(source, 2, axis=1)  # 按列等分为2部分
print("分解结果:")
for idx, section in enumerate(parts):
    print(f"片段{idx}:\n{section}")

6. 实践案例:成绩分析

# 模拟成绩数据:5名学生3科成绩
grades = np.random.randint(65, 100, size=(5, 3))
print("成绩表格:\n", grades)

# 学生总评与平均分
totals = np.sum(grades, axis=1)
averages = np.mean(grades, axis=1)
print("个人总分:", totals)
print("个人均分:", averages)

# 科目最高分查找
math_max = np.max(grades[:, 0])
print("数学最高分:", math_max)

# 筛选优秀学生
excellent_mask = averages > 85
print("高分学生编号:", np.where(excellent_mask))
print("高分学生成绩:\n", grades[excellent_mask])

# 成绩归一化处理
normalized_grades = (grades - np.min(grades)) / (np.max(grades) - np.min(grades))
print("归一化成绩:\n", normalized_grades)

核心要点汇总

类别 关键方法
数组创建 array(), zeros(), ones(), arange(), linspace(), random
属性查询 ndim, shape, size, dtype
数据访问 基础索引、条件筛选(核心技能)
形态调整 reshape(), flatten(), T
数值运算 元素级操作、广播机制(重点难点)
函数工具 数学统计函数,注意axis参数使用
结构操作 vstack, hstack, concatenate, split

推荐通过Jupyter Notebook实践上述示例,深入理解各项功能。掌握基础后可顺利过渡至Pandas学习阶段。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。