python数据分析与机器学习实战

(五)numpy知识学习2-python数据分析与机器学习实战(

2018-05-02  本文已影响19人  努力奋斗的durian

文章原创,最近更新:2018-05-2

1.numpy矩阵基础
2.numpy常用函数
3.矩阵常用操作
4.不同复制操作对比
5.排序和索引
课程来源: python数据分析与机器学习实战-唐宇迪

1.numpy矩阵基础

1.1 or 的判断

现在说说与的操作,与的操作比较严格,&表示与的判断.与的意思是当前的在数组中的元素既等于10又等于5.我们来看一下下面的一个例子:

>>> vector=numpy.array([5,10,15,20])
>>> vector1=(vector==10)&(vector==5)
>>> vector1
array([False, False, False, False])

一个数不可能是既等于10又等于5,所以判断出来的结果是全部等于False.

或的条件限制宽松了一些,对于一个元素可以是满足这个条件,或者也可以满足另外一个条件,用|来表示或.

>>> vector=numpy.array([5,10,15,20])
>>> vector2=(vector==10)|(vector==5)
>>> vector2
array([ True,  True, False, False])
>>> matrix = numpy.array([
            [5, 10, 15], 
            [20, 25, 30],
            [35, 40, 45]
         ])
>>> matrix1=matrix[:,1]==25
>>> matrix1
array([False,  True, False])
>>> matrix[matrix1,1]=10
>>> matrix
array([[ 5, 10, 15],
       [20, 10, 30],
       [35, 40, 45]])

1.2类型的改变

用astype函数更改数据的类型

>>> vector=numpy.array(["1","2","3"])
>>> vector.dtype
dtype('<U1')
>>> vector
array(['1', '2', '3'], dtype='<U1')
>>> vector=vector.astype(float)
>>> vector.dtype
dtype('float64')
>>> vector
array([1., 2., 3.])

1.3数据类型的计算

可按行,或按列用sum 或者min等方式对数值进行计算.

>>> vector = numpy.array([5, 10, 15, 20])
>>> vector.sum()
50
>>> vector.min()
5
>>> matrix = numpy.array([
                [5, 10, 15], 
                [20, 25, 30],
                [35, 40, 45]
             ])
>>> matrix.sum(axis=1)
array([ 30,  75, 120])
>>> matrix.sum(axis=0)
array([60, 75, 90])

2.numpy常用函数

2.1矩阵的属性

构造了一个矩阵后,能否对矩阵进行变换?通过reshape函数更改numpy的维度形状.

>>> import numpy as np
>>> np.arange(15)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
>>> a=np.arange(15).reshape(3,5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

可通过shape知道矩阵的是由几行几列构成.

>>> a.shape
(3, 5)

可通过ndim知道矩阵的维度.一维or二维or其他

>>> a.ndim
2

dtype.name可以知道数据的类型的名称

>>> a.dtype
dtype('int32')
>>> a.dtype.name
'int32'
>>> 

size知道矩阵类型有多少个元素?

>>> a.size
15

2.2矩阵的初始化

用zeros初始化值为0.三行四列(注意参数是个元组)

>>> np.zeros((3,4))
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

用ones初始化为1

>>> np.ones((2,3,4),dtype=np.int32)
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]])

用exp以及sqtr分别对矩阵去e的指数以及开平方.

>>> import numpy as np
>>> B=np.arange(3)
>>> B
array([0, 1, 2])
>>> np.exp(B)
array([1.        , 2.71828183, 7.3890561 ])
>>> np.sqrt(B)
array([0.        , 1.        , 1.41421356])

floor向下取整,比如2.1取值为2,2.9取值也是2

>>> import numpy as np
>>> a=np.floor(10*np.random.random((3,4)))
>>> a
array([[8., 2., 6., 9.],
       [9., 6., 5., 2.],
       [0., 0., 1., 6.]])

>>> a.shape
(3, 4)

3.矩阵常用操作

3.1矩阵行列的转换

用ravel函数将矩阵转换为向量也就是一维.

a.ravel()
array([8., 2., 6., 9., 9., 6., 5., 2., 0., 0., 1., 6.])

用a.shape=(,)更改a为几行几列,与a.reshape()等价

>>> a.shape=(6,2)
>>> a
array([[8., 2.],
       [6., 9.],
       [9., 6.],
       [5., 2.],
       [0., 0.],
       [1., 6.]])
>>> a.reshape(6,2)
array([[8., 2.],
       [6., 9.],
       [9., 6.],
       [5., 2.],
       [0., 0.],
       [1., 6.]])

a.T对a进行转置

>>> a
array([[8., 2.],
       [6., 9.],
       [9., 6.],
       [5., 2.],
       [0., 0.],
       [1., 6.]])
>>> a.T
array([[8., 6., 9., 5., 0., 1.],
       [2., 9., 6., 2., 0., 6.]])

reshape:有返回值,所谓有返回值,即不对原始多维数组进行修改;
resize:无返回值,所谓有返回值,即会对原始多维数组进行修改;

>>> a
array([[8., 2.],
       [6., 9.],
       [9., 6.],
       [5., 2.],
       [0., 0.],
       [1., 6.]])
>>> a.reshape(2,6)
array([[8., 2., 6., 9., 9., 6.],
       [5., 2., 0., 0., 1., 6.]])
>>> a
array([[8., 2.],
       [6., 9.],
       [9., 6.],
       [5., 2.],
       [0., 0.],
       [1., 6.]])
>>> a.resize((2,6))
>>> a
array([[8., 2., 6., 9., 9., 6.],
       [5., 2., 0., 0., 1., 6.]])
>>> 

.reshape(,-1)这个-1是前面定义好几行,后面会自动帮你计算几列,比如reshape(3,-1),

>>> a
array([[8., 2., 6., 9., 9., 6.],
       [5., 2., 0., 0., 1., 6.]])
>>> a.reshape(3,-1)
array([[8., 2., 6., 9.],
       [9., 6., 5., 2.],
       [0., 0., 1., 6.]])

3.2矩阵的拼接操作

可以分为按行拼接还是按列拼接
横着拼,可以用.hstack((,))函数

>>> a=np.floor(10*np.random.random((2,2)))
>>> b=np.floor(10*np.random.random((2,2)))
>>> a
array([[0., 0.],
       [3., 1.]])
>>> b
array([[1., 7.],
       [7., 7.]])
>>> np.hstack((a,b))
array([[0., 0., 1., 7.],
       [3., 1., 7., 7.]])

竖着拼,可以用.vstack((,))函数

>>> a=np.floor(10*np.random.random((2,2)))
>>> b=np.floor(10*np.random.random((2,2)))
>>> a
array([[0., 0.],
       [3., 1.]])
>>> b
array([[1., 7.],
       [7., 7.]])

>>> np.vstack((a,b))
array([[0., 0.],
       [3., 1.],
       [1., 7.],
       [7., 7.]])

3.3矩阵的切分

矩阵的切分可分为按横切分与竖切分
用.hsplit对矩阵进行横切分

>>> a=np.floor(10*np.random.random((2,12)))
>>> a
array([[9., 8., 9., 3., 8., 8., 6., 3., 3., 2., 8., 3.],
       [4., 5., 7., 9., 0., 0., 8., 5., 6., 6., 9., 3.]])

>>> np.hsplit(a,3)
[array([[9., 8., 9., 3.],
       [4., 5., 7., 9.]]), array([[8., 8., 6., 3.],
       [0., 0., 8., 5.]]), array([[3., 2., 8., 3.],
       [6., 6., 9., 3.]])]

用.vsplit对矩阵进行横切分


>>> a = np.floor(10*np.random.random((12,2)))
>>> a
array([[8., 1.],
       [3., 5.],
       [7., 7.],
       [9., 1.],
       [3., 1.],
       [9., 6.],
       [9., 3.],
       [3., 2.],
       [0., 0.],
       [9., 6.],
       [6., 6.],
       [3., 8.]])
>>> np.vsplit(a,3)
[array([[8., 1.],
       [3., 5.],
       [7., 7.],
       [9., 1.]]), array([[3., 1.],
       [9., 6.],
       [9., 3.],
       [3., 2.]]), array([[0., 0.],
       [9., 6.],
       [6., 6.],
       [3., 8.]])]
>>> 

如果按指定区域怎么切分?
.hsplit(a,b)a是指待切分的矩阵,b是指定待切分的刀位置,是个元组(比如,(3,4),分别在3,4列各切一刀)
.vsplit(a,b)与.hsplit(a,b)方法一致

>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[2., 6., 0., 5., 2., 2., 1., 3., 6., 9., 6., 8.],
       [4., 3., 2., 8., 1., 7., 8., 4., 9., 6., 7., 9.]])
>>> np.hsplit(a,(3,4))
[array([[2., 6., 0.],
       [4., 3., 2.]]), array([[5.],
       [8.]]), array([[2., 2., 1., 3., 6., 9., 6., 8.],
       [1., 7., 8., 4., 9., 6., 7., 9.]])]

4.不同复制操作对比

关于复制有3种方法

4.1等号赋值

>>> a=np.arange(12)
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> b=a
>>> b
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> b is a
True

将b改成3行4列,当对b变化,a是否会发生变化?

>>> b
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> b.shape=(3,4)
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

>>> a.shape
(3, 4)

先把a的值赋给了b,b做了变化之后,a也会发生变化可以通过id值查询是否两者发生了相同的变化.(注意:id值相当于我们创建的时候,内存会分配一个唯一的区域.)

>>> id(a)
179563056
>>> id(b)
179563056

a,b两值的id值一模一样.说明a,b两值名字不同,但是指向的东西是一样的.改变a,b其中某个,两者都会发生变化.

4.2view操作

通过view操作,两个值不一样.

>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> c=a.view()
>>> c
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> c is a
False

将c变化,变成2行,6列的矩阵

>>> c.shape=(2,6)
>>> c
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

看一下a的shape是否会发生改变?
a未发生变化,a与c是不一样的

>>> a.shape
(3, 4)

将c矩阵的某个元素更改,a是否会更改?

>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> c
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

>>> c[0,4]=1234

>>> c
array([[   0,    1,    2,    3, 1234,    5],
       [   6,    7,    8,    9,   10,   11]])
>>> a
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])

>>> id(a)
179563056
>>> id(c)
179455120

通过上面可以看出,a的数值也发生了变化.因id不一样,说明a,b指向不一样,但是共用一套数值.

4.3copy复制

既让复制的值不一样,存储的区域也不一样,就使用copy复制.
相当于,一开始做了复制,然后是各自就各自,直接没有任何的关系.这是最常用的方法.

d用a的值进行初始化,初始化之后就没有关系.

>>> a
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])

>>> d=a.copy()
>>> d
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])
>>> d is a
False
>>> d[0,0]=9999

>>> d
array([[9999,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])
>>> a
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])

5.排序和索引

5.1寻找最大值

寻找矩阵哪个位置的值最大?
.argmax()函数寻找

>>> import numpy as np
>>> data= np.sin(np.arange(20)).reshape(5,4)
>>> data
array([[ 0.        ,  0.84147098,  0.90929743,  0.14112001],
       [-0.7568025 , -0.95892427, -0.2794155 ,  0.6569866 ],
       [ 0.98935825,  0.41211849, -0.54402111, -0.99999021],
       [-0.53657292,  0.42016704,  0.99060736,  0.65028784],
       [-0.28790332, -0.96139749, -0.75098725,  0.14987721]])
>>> ind=data.argmax(axis=0)
>>> ind
array([2, 0, 3, 1], dtype=int64)

结果是[2,0,1],矩阵按列计算,哪个值最大.

[2,0,1]这个索引值有什么用,可以通过这个索引值具体寻找最大的值是多少?

>>> data_max=data[ind,range(data.shape[1])]
>>> data_max
array([0.98935825, 0.84147098, 0.99060736, 0.6569866 ])

ind这个值传进来,相当于找到了这一行,再找列值,可以拿出最大的值.通过找索引的格式,在通过索引的实际标号拿出来.

5.2矩阵的拓展

用.tile函数进行拓展,可以对行与列都进行拓展,

>>> a=np.arange(0,40,10)
>>> a
array([ 0, 10, 20, 30])

>>> b=np.tile(a,(2,2))
>>> b
array([[ 0, 10, 20, 30,  0, 10, 20, 30],
       [ 0, 10, 20, 30,  0, 10, 20, 30]])

5.3矩阵的排序

用.sort()函数对矩阵排序

>>> a = np.array([[4, 3, 5], [1, 2, 1]])
>>> a
array([[4, 3, 5],
       [1, 2, 1]])
>>> b=np.sort(a,axis=1)
>>> b
array([[3, 4, 5],
       [1, 1, 2]])

用.argsort()求矩阵排序后的索引结果

>>> a = np.array([4, 3, 1, 2])
>>> j=np.argsort(a)
>>> j
array([2, 3, 1, 0], dtype=int64)
>>> a[j]
array([1, 2, 3, 4])

拓展:
1.先定义一个array数据

 import numpy as np
 x=np.array([1,4,3,-1,6,9])

2.现在我们可以看看argsort()函数的具体功能是什么:

x.argsort()
输出定义为y=array([3,0,2,1,4,5])。

我们发现argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。例如:x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5。

上面这个不难理解,不熟悉的可以去python环境下自己尝试。

上一篇下一篇

猜你喜欢

热点阅读