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.youkuaiyun.com/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拼接起来的值