[最完整版本]详细例子,np.cumsum()你只看这一篇就够了!

1.定义

老规矩,遇事不决,先查手册,下面是关于 numpy官方手册中关于np.cumsum()的定义与例子:
在这里插入图片描述
在这里插入图片描述

同时,官方提供了几个例子:

>>> a = np.array([[1,2,3], [4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> np.cumsum(a)
array([ 1, 3, 6, 10, 15, 21])
>>> np.cumsum(a, dtype=float)
# specifies type of output value(s)
array([ 1.,
3.,
6., 10., 15., 21.])
>>> np.cumsum(a,axis=0)
array([[1, 2, 3],
[5, 7, 9]])
>>> np.cumsum(a,axis=1)
array([[ 1, 3, 6],
[ 4, 9, 15]])

2. 实际用例分析

2.1在axis=None时

根据官方文档:The default (None) is to
compute the cumsum over the flattened array.
在axis=None时计算的是展平累积和:

a
Out[19]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
a.shape
Out[20]: (3, 3)

a为一个3x3的np array,当我们对其进行处理时,会得到如下结果:
(转载请注明原文链接:详细例子,np.cumsum()你只看这一篇就够了!https://blog.csdn.net/ftimes/article/details/119682910)

a.cumsum()#默认axis=None
Out[21]: array([ 1,  3,  6, 10, 15, 21, 28, 36, 45])

这是什么意思呢?
我们先把a展平:

a = [1,2,3,4,5,6,7,8,9]#a展平后效果
1+0=1
2+1=3
3+3=6
4+6=10
5+10=15
...
9+36=45

a.cumsum()的每一项为a中前面所有项的累积和,不管a是多少维都可以想象成拉伸之后做包括自己在内前n项求和。

2.2 当指定axis时

2.2.1 axis=1 and axis=2

这种情况有个某乎博主讲得非常清楚,节选主要部分放在这里供个人笔记之用,某乎链接:https://zhuanlan.zhihu.com/p/137159373。

下一节我将继续补充高维情况的用例供参考。

import numpy as np a = np.asarray([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]) b = a.cumsum(axis=0) print(b) c = a.cumsum(axis=1) print©

定义一个numpy矩阵a,3x3:

[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]

运行结果:

b为:

[[ 1 2 3]
[ 5 7 9]
[12 15 18]]

c为:

[[ 1 3 6]
[ 4 9 15]
[ 7 15 24]]

三、结果解释

1.参数axis=0指的是按行累加,即本行=本行+上一行,b的由来:

第二行:[5 7 9]

其中1 2 3是第一行累加之后的结果(因为第一行没有前一行,所以可以理解为 + 0)

5 = 1 + 4
7 = 2 + 5
9 = 3 + 6

第三行:[12 15 18]

其中5 7 9是第二行累加之后的结果

12 = 5 + 7 = 1 + 4 + 7
15 = 7 + 8 = 2 + 5 + 8
18 = 9 + 9 = 3 + 6 + 9

所以最终是:

1 2 3
5 7 9
12 15 18

2.参数axis=1指的是按列相加,即本列=本列+上一列

同样的道理:

第二列:

3 = 1 + 2
9 = 4 + 5
15 = 7 + 8

第三列:

6 = 3 + 3 = 1 + 2 + 3
15 = 9 + 6 = 4 + 5 + 6
24 = 15 + 9 = 7 + 8 + 9

2.2.1 axis>2?

首先创建一个新的数组:

a=np.arange(1,13,1).reshape(2,2,3)
a
Out[27]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6]],
       [[ 7,  8,  9],
        [10, 11, 12]]])

第0个维度为:

a[0]
Out[28]: 
array([[1, 2, 3],
       [4, 5, 6]])
a[1]
Out[29]: 
array([[ 7,  8,  9],
       [10, 11, 12]])

进行测试:

b=np.cumsum(a,axis=0)
Out[32]: 
b=array([[[ 1,  2,  3],
        [ 4,  5,  6]],
       [[ 8, 10, 12],
        [14, 16, 18]]])

a[0]前面没有了,所以a[0]+0=a[0]

a[1]=array([[ 7,  8,  9],
       [10, 11, 12]])

a[0]+a[1]就得到了b[1],从如下代码可以得到验证。

b=np.cumsum(a,axis=0)
b[1]
Out[34]: 
array([[ 8, 10, 12],
       [14, 16, 18]])
a[0]+a[1]
Out[35]: 
array([[ 8, 10, 12],
       [14, 16, 18]])
a[0]+a[1]==b[1]
Out[36]: 
array([[ True,  True,  True],
       [ True,  True,  True]])

显而易见,在axis=1时(第二维),和上述方法类似。
下面我们看一下axis=2时的例子

b=np.cumsum(a,axis=2)
b
Out[38]: 
array([[[ 1,  3,  6],
        [ 4,  9, 15]],
       [[ 7, 15, 24],
        [10, 21, 33]]])
        
a[:,:,0]
Out[43]: 
array([[ 1,  4],
       [ 7, 10]])

可以看到第三维(axis=2)index=0时数据仍在b中可见。

a[:,:,0]+a[:,:,1]
Out[46]: 
array([[ 3,  9],
       [15, 21]])
a[:,:,0]+a[:,:,1]+a[:,:,2]
Out[47]: 
array([[ 6, 15],
       [24, 33]])
a[:,:,0]+a[:,:,1]==b[:,:,1]
Out[48]: 
array([[ True,  True],
       [ True,  True]])
a[:,:,0]+a[:,:,1]+a[:,:,2]==b[:,:,2]
Out[49]: 
array([[ True,  True],
       [ True,  True]])

均与我们第一次实验的结果符合,有了实验的过程,我们可以尝试性做一个小结。

3.小结

通过以上测试,我对np.cumsum()的理解如下:
以axis为固定轴,在该轴上进行滑动累加
以形状为[2,2,3]的a为例,令b=np.cumsum(a,axis=0)
那么有

b[0,:,:]=a[0,:,:]
b[1,:,:]=a[0,:,:]+a[1,:,:]

拓展到更一般的情况:
n为a在某axis上最大index值:
那么有:

b[...,0,...]=a[...,0,...]
b[...,1,...]=a[...,0,...]+a[...,1,...]
...
b[...,n,...]=a[...,0,...]+a[...,1,...]+...+a[...,n,...]=b[...,n-1,...]+a[...,n,...]

最后,np.cumsum()的返回值就等于将所有b[…]按axis拼接起来的值

猜你喜欢

转载自blog.csdn.net/ftimes/article/details/119682910
今日推荐