MATLAB与PYTHON交互学习(中)

MATLAB与PYTHON交互学习(中)

一,numpy包中的函数

相对于matlab,python中的numpy包中的函数更倾向于只返回一个变量甚至一个值,其中像:min,max,mean,std,var,size等函数更为明显,以min为例(numpy中的例子):

>>> a = np.arange(4).reshape((2,2))
    >>> a
    array([[0, 1],
           [2, 3]])
    >>> np.amin(a)           # Minimum of the flattened array
    0
    >>> np.amin(a, axis=0)   # Minima along the first axis
    array([0, 1])
    >>> np.amin(a, axis=1)   # Minima along the second axis
    array([0, 2])

可见min不会默认去按行或者列去计算,而是直接返回一个证死的最小值,又如size:

    >>> a = np.array([[1,2,3],[4,5,6]])
    >>> np.size(a)
    6
    >>> np.size(a,1)
    3
    >>> np.size(a,0)
    2

可见numpy包中函数,通过0和1的方式来确定按列还是按行计算的方式与matlab相同。还需要注意的是,python中所谓的矩阵就是数组,若sum等函数的输入为二维数组时,输出将变成一维数组

二,numpy包中的数组

1,与matlab不同,python中的取范围操作一般不包含上界,如range,arange,以及如aa[1:3][:]取出的数实际上是aa的前两行所有列。
2,不同于matlab的将所有行向量,列向量均看做矩阵不同,numpy有一维数组和二维数组之分,即一个列向量既可以表现成二维数组也可以表现成一维数组(这个好像,所有编程语言都可以)。如Spyder中的一个3行1列的数组,表现形式不同

import numpy as np
aa=np.zeros(3)
bb=np.zeros((3,1))

这里写图片描述
1)因此在使用numpy时需要注意当前操作的是二维数组还是一维数组,numpy中有很多函数都是像zeros一样,不同的调用形式可能不同的数组形式(一维,二维)。
2)获取二维array中的具体某个值有两种不同的方法,如下矩阵:

aa=
1   2   3 
4   5   6 
7   8   9
10  11  12

aa[1,2]=6;aa[1][2]=6,但是并不代表aa[1,2]的性质就等同于aa[1][2],即aa[]与aa[][]是两种性质的取数,对于获取二维数组中的数正确的使用应该是前者,因为只有前者是专为二维数组而设计的,后者仅仅是相当于先从二维数组中取出某一行变成一维数组,再取出一维数组的某个值,是两个操作的结果。
如:gg=aa[:][2];ff=aa[2][:],gg和ff的值相同均为一维数组7 8 9,gg的过程为先取出二维数组中的所有值(相当于不变),然后再取出第3行;ff的过程相当于先取出第3行,在取出第3行的所有值。综上如果想去除aa中的第3行所有列需要使用aa[2,:]的方式。
3)numpy中表示二维数组还可以使用matrix形式,matrix是array的一种特殊格式,两者在spyder编译器的Variable explorer中的呈现完全一致!但是在有的地方两者却有明显的不同,尤其是乘法上。*在含有matrix形式的式子里表示矩阵之间的乘法,而在array中表示对应元素相乘。所以当式子里既有matrix,还有array时,会经常报错,而且非常难排查!建议使用array即可,不要随意在代码中使用matrix。

三,numpy面对NaN

在使用python进行算法设计以及数据挖掘时经常遇到NaN的现象,python对NaN的处理不如matlab的友善,如求含有NaN数组的的最大值:

 aa=[NaN,1,2,3,4]

使用matlab的话max(aa)=4,因为matlab认为NaN不是一个数,所以不应参与最大值的计算,在使用归一化函数mapminmax,NaN也是不参与运算的。但是实际上如果使用排序函数的话就会发现,sort 函数将NaN数据当做一个最大值。

sort(aa,'ascend')
ans =
     1     2     3     4   NaN
sort(aa,'descend')
ans =
   NaN     4     3     2     1

当list或者array中含有NaN时,python中无论是自带的max还是numpy中的max,将返回值全是NaN。如下代码

import numpy as np
aa=[1,2,3,4]
aa[0]=np.NaN
dd=max(aa)
bb=np.array(aa)
cc=np.max(bb)
ee=max(bb)

dd,bb,cc,ee的结果全是NaN。但是万能的numpy有专门针对NaN的函数,就是在原来相应的函数前面加上nan,如np.nanmin,np.nansum等等,如下代码:

aa=[1,2,3,4]
aa[0]=np.NaN
dd=np.nanmax(aa)

虽然第一个值被替换成了NaN,但是计算max时并未考虑到NaN,有事在处理NaN时,并不愿意忽略它,而是使用平均值代替,此时可以使用如下代码:

from sklearn.preprocessing import Imputer
aa=[[4,7,3,4],[1,1,7,8]]
aa[1][1]=np.NaN
my_imputer = Imputer()
new_data_imputed = my_imputer.fit_transform(aa)

运行的结果:array([[4., 7., 3., 4.],[1., 7., 7., 8.]]) 可以看出NaN被同一列的均值代替,实际上这个已经牵涉到了python中机器学习的包中的预处理(以后开专栏做笔记)。
在上面处理的过程中发现numpy包可以很好的兼容,python中自带的list,也就是说,如果list结构中都是纯数据时,可以直接调用numpy中的函数。

猜你喜欢

转载自blog.csdn.net/u012140304/article/details/81315551
今日推荐