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. 若两个数组在某一维度的大小相同,或其中一维为1,则可广播。
  2. 广播后,数组的每个维度会扩展为最大值。
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 数组操作是数据科学的基石,其核心优势在于高效性与简洁性。通过本文的讲解,读者应能掌握从基础创建到高级广播的完整操作链路。建议读者通过以下步骤深化理解:

  1. numpy 处理实际数据集(如 CSV 文件)
  2. 尝试复现文中案例并调整参数观察结果
  3. 探索 numpy 官方文档中的其他函数(如 np.where()np.linalg 模块)

掌握这些技能后,无论是数据分析、机器学习还是科学计算,你都将拥有更强大的工具来应对复杂任务。记住:实践是精通技术的最佳路径!

最新发布