科研菜鸟分享 http://blog.sciencenet.cn/u/sanshiphy 聚沙成塔,集腋成裘 leilphy@gmail.com

博文

Python初学之解读MDFA模块(2):解读 def rwalk(X, axis=-1)

已有 6738 次阅读 2018-10-19 19:09 |个人分类:技术备忘录|系统分类:科研笔记| python, mdfa, rwalk, cumsum, reshape

初稿: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维度方向元素的去平均累积和\sum{(X-\bar{X})},默认的是对横向元素(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. ]]

NOTE

  • 解引用

在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]]


https://blog.sciencenet.cn/blog-200199-1141770.html

上一篇:利用 MATLAB 读取并展示高程数据
下一篇:长程相关时间序列的回归时间分布
收藏 IP: 159.226.234.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-18 16:12

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部