|||
初稿:2018-10-19
转载请注明:科研菜鸟:http://blog.sciencenet.cn/home.php?mod=spacecp&ac=blog
Multifractal Detrended Fluctuation Analysis (MDFA)是计算非平稳序列多重分形谱的一种实用算法。本文解读MDFA的python模块(pymdfa.py),该代码由Copyright (c) 2014 Peter Jurica @ RIKEN Brain Science Institute, Japan提供。
pymdfa.py 主要由5个可由用户调用的函数:__all__ = ["fastRMS","compRMS","compFq","simpleRMS","rwalk"]
和一个用户不可调用的函数:def rw(X,w,step=1):
组成。本文将在python初学者的基础上讲解函数rwalk(X, axis=-1)
。
通过理解rwalk(X, axis=-1)
函数,可掌握解引用和数组维度的概念以及numpy模块中reshape、cumsum函数的用法。
rwalk(X, axis=-1)
功能: .计算X
在axis维度方向元素的去平均累积和,默认的是对横向元素(axis=-1
)进行上述运算。
源代码:
def rwalk(X, axis=-1):
"""Compute cumulative sum and subtract mean.
This function computes the sum along the last dimension.
Parameters
----------
X: array
axis: array dimension along which to compute (default -1, the last dimension)
"""
shp = list(X.shape) # change a tuple to a list
shp[axis] = 1
return numpy.cumsum(X - X.mean(axis).reshape(*shp), axis) # *shp表示将shp list的两个值分开,分别赋值给reshape的两个参数,这种赋值方式成为解引用,相关概念参考文后NOTE。
# cumsum第二个参数表示沿第axis个维度进行累积和操作,具体应用参考文后NOTE
# reshape用法参考文后NOTE
# X.mean(axis):axis方向求平均#运行示例import numpy
x = numpy.array([[1,2],[3,4]])
print(rwalk(x))
[[-0.5 0. ]
[-0.5 0. ]]
在list\tuple变量中均可用*
实现解应用,在dictionary变量中用*
实现对key的解引用,用**
实现对value的解引用。下面是一些例子:
def fun(a,b,c):
print(a)
print(b)
print(c)
x=[1,2,'WO']
y=(1,2,'WO')
z={'a':1,'b':2,'c':'WO'}
z0={'b':1,'c':2,'a':'WO'}
fun(*x)
print()
fun(*y)
print()
fun(*z)# *z调用z中的keyprint()
fun(**z) # **z调用z中的valueprint()
fun(*z0)# *z0 key按元素顺序解print()
fun(**z0) # **z0 value不按元素顺序解
1
2
WO
1
2
WO
a
b
c
1
2
WO
b
c
a
WO
1
2
数组维度
数数组的方括号嵌套数,就可以知道数组是几维的,例如[1,2,3]
是1D数组,[[1,2],[3,4]]
是2D数组,[[[1,2],[3,4]],[[5,6],[7,8]]]
是3D数组。数组的维度约定按从高到低排列,例如:
import numpy as np
x = np.array([1,2,3,4]) # 1D 数组,数组维度上元素数量记作 (4,)print(x.shape)
x = np.array([[1,2,3],[3,4,5]]) # 2D数组,数组各维度上元素数量记作 (2,3),约定列方向(竖向)是比行方向(横向)更高维度,列方向数量排在前面print(x.shape)
x = np.array([[[1,2,1],[3,4,1],[5,6,1],[7,8,1]],[[5,6,1],[7,8,1],[3,4,1],[1,2,1]]]) # 顺数第二层括号对有两个,这是最高维,因此最高维有2个元素,剩下维度与2D数组排序同print(x.shape)
(4,)
(2, 3)
(2, 4, 3)
CUMSUM
cumsum
函数用于求累积和,主要用法如下示例:
import numpy as np
x = np.array([[1,2],[3,4]])
print(np.cumsum(x)) # 如果不指定累积和维度,cumsum先将x按C_contiguous方式reshape成一维数组后再求累积和print(x.cumsum()) # 另外一种调用方法print(np.cumsum(x,0)) # 按最高维度方向进行元素累积和,本例中竖向元素求累积和print(np.cumsum(x,1)) # 横向元素累积和
[ 1 3 6 10]
[ 1 3 6 10]
[[1 2]
[4 6]]
[[1 3]
[3 7]]
RESHAPE
‘reshape’函数返回一个对原数组变形后的新数组,具体说,就是内存中按某一contiguous排列的数,按新数组维度从高到低排列,这种功能与numpy.lib.stride_tricks.as_strided函数在某种参数设定下相同。主要用法如下示例:
import numpy as np
x = np.arange(10)
print(x.reshape(2,5))
print(np.reshape(x,(2,5))) #这是另一种reshape的方法,注意,这种方法的参数必须是一个tupleprint(x.shape) # reshape函数默认设置本身并不改变x的结构,只是返回了一个形变的viewy = np.reshape(x,(2,5))
x[0]=-1print(y) # 由于reshape返回的是view,x的值变,y的相应值也变化# 要改变x的shape结构,有两种方法:# 方法一:reshape后返回给自身x = np.arange(12)
x = x.reshape(2,6)
print(x)# 方法二:使用resize函数x.resize(3,4)
print(x)# reshape 与 as_strided 函数的等价性from numpy.lib.stride_tricks import as_strided as ast
x = np.arange(12)
print(ast(x,(2,6),(24,4)))
print(x.shape) # 这种方法也不改变x的结构本身,ast返回的也只是个viewprint(ast(x,(3,4),(16,4)))
[[0 1 2 3 4]
[5 6 7 8 9]]
[[0 1 2 3 4]
[5 6 7 8 9]]
(10,)
[[-1 1 2 3 4]
[ 5 6 7 8 9]]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
(12,)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-16 19:15
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社