Numpy 数组操作(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据科学与科学计算领域,Numpy 数组操作如同一把瑞士军刀,能够高效处理结构化数据的存储、运算和转换。对于编程初学者而言,理解 Numpy 数组的特性与核心操作,是迈向高效计算的第一步;而对中级开发者来说,掌握其进阶技巧则能显著提升代码的简洁性和运行效率。本文将以循序渐进的方式,结合实际案例,深入剖析 Numpy 数组操作的核心知识点。
数组的创建与初始化
Numpy 数组(Ndarray)是多维数据的容器,其底层基于连续的内存块,这使得批量操作比 Python 原生列表快数十倍。以下是几种常见的创建方式:
1. 通过 numpy.array()
直接转换
import numpy as np
arr_1d = np.array([1, 2, 3, 4])
print("一维数组:", arr_1d)
arr_2d = np.array([[1, 2], [3, 4]])
print("二维数组:\n", arr_2d)
比喻:将散落的物品按规则排列到货架(数组)中,每个位置都有明确的坐标。
2. 预定义函数快速生成
np.zeros()
:创建全零数组np.ones()
:创建全一数组np.arange()
:类似 Python 的range()
,但返回数组np.linspace()
:生成等间距数值
zeros_arr = np.zeros((2, 3)) # 2行3列的零矩阵
print("全零数组:\n", zeros_arr)
range_arr = np.arange(10)
print("等差数列:", range_arr)
索引与切片操作
数组的索引和切片是访问数据的基础,其规则与 Python 列表类似,但支持多维扩展。
单一元素访问
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("元素值:", arr[0, 1]) # 输出 2
注意:二维数组的索引顺序是 行索引, 列索引
。
多维切片
sub_arr = arr[0:2, 1:3] # 前两行,列1到列2(不包含3)
print("子数组:\n", sub_arr)
比喻:将数组想象为一张网格,切片如同用剪刀裁剪出特定区域。
形状操作与重塑
数组的形状(Shape)决定了其维度和每个维度的大小。通过 reshape()
、transpose()
等方法,可以灵活调整数据结构。
1. reshape()
:改变数组维度
original = np.arange(6) # 一维数组 [0,1,2,3,4,5]
reshaped = original.reshape(2, 3) # 转为2行3列
print("重塑后的数组:\n", reshaped)
关键点:新形状的元素总数必须与原数组一致。
2. transpose()
:转置数组
matrix = np.array([[1, 2], [3, 4]])
transposed = matrix.transpose()
print("转置后的矩阵:\n", transposed)
比喻:转置如同将书架的行与列交换,使原本的行元素变为列元素。
数学运算与广播机制
Numpy 的核心优势在于向量化运算,即直接对数组进行数学操作,无需显式循环。
基础运算
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]
对比:与 Python 列表逐个元素计算相比,Numpy 的向量化运算速度提升显著。
广播(Broadcasting)
广播机制允许不同形状的数组进行算术运算,规则包括:
- 若两个数组在某一维度的大小相同,或其中一维为1,则可广播。
- 广播后,数组的每个维度会扩展为最大值。
a = np.array([[1], [2], [3]]) # 形状(3,1)
b = np.array([4, 5, 6]) # 形状(3,)
result = a + b # 广播后结果形状(3,3)
print("广播后的结果:\n", result)
比喻:广播如同将一张邮票按压到信封上,自动适应更大的区域。
高级操作:排序、去重与统计
1. 排序与去重
arr = np.array([3, 1, 2, 2, 4])
sorted_arr = np.sort(arr) # 排序后 [1,2,2,3,4]
unique_vals = np.unique(arr) # 去重后 [1,2,3,4]
2. 统计函数
data = np.array([[1, 2], [3, 4]])
print("最大值:", np.max(data)) # 4
print("平均值:", np.mean(data)) # 2.5
print("沿列求和:", np.sum(data, axis=0)) # [4,6]
参数说明:axis=0
表示按列操作,axis=1
表示按行操作。
实际案例:图像数据的数组操作
假设我们有一个灰度图像数据,形状为 (高度, 宽度)
的二维数组:
image = np.random.randint(0, 256, size=(100, 100))
adjusted = np.clip(image * 1.2, 0, 255).astype(int)
center = adjusted[40:60, 40:60]
应用价值:通过数组操作,图像处理任务(如滤波、裁剪)的代码简洁且高效。
结论
Numpy 数组操作是数据科学的基石,其核心优势在于高效性与简洁性。通过本文的讲解,读者应能掌握从基础创建到高级广播的完整操作链路。建议读者通过以下步骤深化理解:
- 用
numpy
处理实际数据集(如 CSV 文件) - 尝试复现文中案例并调整参数观察结果
- 探索
numpy
官方文档中的其他函数(如np.where()
、np.linalg
模块)
掌握这些技能后,无论是数据分析、机器学习还是科学计算,你都将拥有更强大的工具来应对复杂任务。记住:实践是精通技术的最佳路径!