python 中 np.sum()函数 通俗易懂理解!

这一篇博客保证是我写的最清楚,最容易理解的博客!!

     众所周知,sum不传参的时候,是所有元素的总和。这里就不说了。

1 sum函数可以传入一个axis的参数,这个参数怎么理解呢?这样理解:

假设我生成一个numpy数组a,如下

>>> import numpy as np
>>> a = np.array([[[1,2,3,2],[1,2,3,1],[2,3,4,1]],[[1,0,2,0],[2,1,2,0],[2,1,1,1]]])
>>> a
array([[[1, 2, 3, 2],
        [1, 2, 3, 1],
        [2, 3, 4, 1]],

       [[1, 0, 2, 0],
        [2, 1, 2, 0],
        [2, 1, 1, 1]]])
>>> 

这是一个拥有两维的数组,每一维又拥有三个数组,这个数组里面拥有四个元素。如果我们要将这个a数组中的第一个元素1定位出来,则我们会输入a[0][0][0]。好,这个axis的取值就是这个精确定位某个元素需要经过多少数组的长度,在这里是3,,所以axis的取值有0,1,2。如果一个数组精确到某个元素需要a[n0][n1][n2][...][n],则axis的取值就是n。定位 到这里,axis的参数的取值就解释完成了。

2 理解参数axis取值对sum结果的影响:

前面说了axis的取值(以数组a为例),axis=0,1,2。在这里,精确定位到某个元素可以用a[n0][n1][n2]表示。n0的取值是0,1(数组两维),代表第一个索引;n1的取值是0,1,2(每一维数组拥有3个子数组),代表第二个索引;n2的取值是0,1,2,3(每个子数组有4个元素),代表第三个索引,这几个取值在后面会用到。

        2.1 axis = 0的时候:

     axis=0,对应n0已经确定下来,即n0取值定为0,1。所以sum每个元素的求和公式是sum = a[0][n1][n2]+a[1][n1][n2]。接下来确定sum的行数和列数,n1的取值是0,1,2,为3个数,代表行数,n2的取值是0,1,2,3,为4个数,代表列数,所以sum为3*4的数组。

      如何求sum的各个元素呢,sum = a[0][n1][n2]+a[1][n1][n2]这个公式又如何理解呢?如下。我们可以做一个表格:注意颜色


                      n2=0                n2=1           &nb
### 高斯求积法与贝塞尔曲线的基本概念 - **高斯求积法**:是一种数值积分方法,用于近似计算定积分的值。其核心思想是通过选取特定的节点和对应的权重,将积分转化为节点处函数值的加权和,从而避免了复杂的积分运算。在数学上,对于一个定积分 $\int_{a}^{b} f(x)dx$,高斯求积法可以近似表示为 $\sum_{i = 1}^{n} w_i f(x_i)$,其中 $x_i$ 是节点,$w_i$ 是对应的权重,$n$ 是节点的数量。 - **贝塞尔曲线**:是一种在计算机图形学、动画设计等领域广泛应用的曲线,它通过控制点来定义曲线的形状。一般来说,$n$ 阶贝塞尔曲线由 $n + 1$ 个控制点 $P_0, P_1, \cdots, P_n$ 确定,其参数方程为 $B(t)=\sum_{i = 0}^{n} C_{n}^{i}(1 - t)^{n - i}t^{i}P_i$,其中 $t \in [0, 1]$,$C_{n}^{i}=\frac{n!}{i!(n - i)!}$ 是组合数。 ### 用高斯求积法计算贝塞尔曲线长度的步骤 1. **确定贝塞尔曲线的参数方程**:根据给定的控制点,写出贝塞尔曲线的参数方程 $B(t)$。 2. **计算曲线的导数**:对参数方程 $B(t)$ 求导,得到 $B^\prime(t)$。曲线的导数表示曲线在每个点处的切线向量,它的模长 $|B^\prime(t)|$ 表示曲线在该点处的局部长度变化率。 3. **构建积分表达式**:贝塞尔曲线的长度可以通过对曲线导数的模长在参数区间 $[0, 1]$ 上进行积分得到,即 $L=\int_{0}^{1}|B^\prime(t)|dt$。 4. **应用高斯求积法**:根据高斯求积法的公式,选取合适的节点 $t_i$ 和权重 $w_i$,将积分近似为 $\sum_{i = 1}^{n} w_i |B^\prime(t_i)|$。 ### 示例代码 ```python import numpy as np # 定义贝塞尔曲线的控制点 control_points = np.array([[0, 0], [1, 2], [3, 3], [4, 1]]) # 计算贝塞尔曲线的参数方程 def bezier_curve(t, control_points): n = len(control_points) - 1 result = np.zeros(2) for i in range(n + 1): binomial_coefficient = np.math.factorial(n) / (np.math.factorial(i) * np.math.factorial(n - i)) result += binomial_coefficient * ((1 - t) ** (n - i)) * (t ** i) * control_points[i] return result # 计算贝塞尔曲线的导数 def bezier_derivative(t, control_points): n = len(control_points) - 1 result = np.zeros(2) for i in range(n): binomial_coefficient = np.math.factorial(n - 1) / (np.math.factorial(i) * np.math.factorial(n - 1 - i)) result += n * binomial_coefficient * ((1 - t) ** (n - 1 - i)) * (t ** i) * (control_points[i + 1] - control_points[i]) return result # 计算曲线导数的模长 def derivative_magnitude(t, control_points): derivative = bezier_derivative(t, control_points) return np.linalg.norm(derivative) # 高斯求积法的节点和权重 nodes, weights = np.polynomial.legendre.leggauss(10) # 将节点从 [-1, 1] 映射到 [0, 1] mapped_nodes = (nodes + 1) / 2 # 应用高斯求积法计算曲线长度 curve_length = sum(weights * derivative_magnitude(mapped_nodes, control_points)) / 2 print("贝塞尔曲线的长度约为:", curve_length) ``` ### 代码解释 1. **定义贝塞尔曲线的控制点**:使用 `np.array` 定义了一个包含四个控制点的数组。 2. **计算贝塞尔曲线的参数方程**:通过 `bezier_curve` 函数实现,根据贝塞尔曲线的参数方程进行计算。 3. **计算贝塞尔曲线的导数**:通过 `bezier_derivative` 函数实现,对参数方程求导。 4. **计算曲线导数的模长**:通过 `derivative_magnitude` 函数实现,使用 `np.linalg.norm` 计算向量的模长。 5. **高斯求积法的节点和权重**:使用 `np.polynomial.legendre.leggauss` 函数获取高斯求积法的节点和权重。 6. **将节点从 [-1, 1] 映射到 [0, 1]**:由于贝塞尔曲线的参数区间是 $[0, 1]$,而高斯求积法的节点通常在 $[-1, 1]$ 区间,因此需要进行映射。 7. **应用高斯求积法计算曲线长度**:根据高斯求积法的公式,将节点和权重代入计算曲线长度。 ### 总结 通过高斯求积法,可以将复杂的积分运算转化为简单的加权求和运算,从而近似计算贝塞尔曲线的长度。这种方法在实际应用中具有较高的精度和效率。
评论 27
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值