源码解析_Python Numpy gradient源码解析

本文深入探讨了Numpy的gradient函数,该函数用于计算数组的梯度。主要内容包括一维和多维数组的梯度计算,边缘处理选项,以及一阶和二阶中心差分公式。博客指出,尽管文档提到中间元素使用2阶中心差分,但实际上默认使用一阶中心差分。此外,边缘处理可以通过edge_order参数调整。文章适合对数值计算和Numpy感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复习图像梯度,发现Numpy有一个梯度计算函数,解析它的源码和需要注意的问题,最后自定义一个梯度函数

Numpy提供了数组梯度计算函数

gradient(f, *varargs, **kwargs)

输入

必选参数:类N维数组(列表/元组/数组)

可选参数:标量列表或数组列表,用于计算差分时的间隔空间

单个标量:为所有轴指定间隔

N个标量:为每一轴指定了间隔,比如dx, dx, dz...

N个数组:为f的每一轴都指定了采样值的下标,每个数组的长度必须匹配相对应那一维的长度

N个标量或数组的组合,其作用等同于2和3

注意:如果关键字参数axis被指定,那么这个可选参数的长度必须和要计算的轴数一致

关键字参数有2个:

edge_order:在边界使用第N-阶差分公式,默认是1-阶

axis:None或者是整数又或者是整数的元组,表示沿着指定的轴计算梯度,默认为None,表示计算所有轴的梯度。如果输入为负数,表示从后向前计算轴的梯度

从它的介绍中,我唯一没理解的就是可选参数的用法,看了代码后也没理解,因为它和一阶差分没有关系,所以在后面的内容就忽略对可选参数的解析

输出

如果输入是一维数组,返回同样大小的梯度数组

如果是多维数组,并要求计算多维,那么返回一个列表,包含计算的每一维的梯度,其大小和输入数组一致

计算方式

在它的介绍中,中间元素使用**2阶中心差分**,但是查看源码发现,它默认使用的其实是一阶中心差分,除非输入可选参数的3和4选项,但是代码中的二阶差分公式也没看懂?,应该是使用泰勒级数的近似公式,所以跳过对代码中二阶差分的介绍

两边使用一阶前向或后向差分,也可通过关键字参数edge_order修改计算方式

差分公式

一阶前向差分:

42e023b28fbc95501ccb920e690cb2c7.png

一阶后向差分:

299006317e5ee57bc26217cb42f6fae0.png

一阶中心差分:

7f3a00f19447282b7a9303037d21c6d1.png

二阶中心差分:

334cfcadb9e34b7457c25e6839b57703.png

3939c505e4a6002dd71e6c6989b50438.png

133c0653356c3146158a7d3a3fb93f94.png

f298c62e783a886a75082173b54e0fc1.png

cef801e8b1c19c7ec67925ad620600db.png

源码分析见:

https://blog.youkuaiyun.com/u012005313/article/details/84035371​blog.youkuaiyun.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值