(五)numpy知识学习2-python数据分析与机器学习实战(
文章原创,最近更新: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环境下自己尝试。