一.科学计算库-Numpy
(1)Numpy概述
Numpy有很多封装好的类库,直接调用就行,不用python自己去实现了。
1)要用numpy库前,首先要把它导入进来。例如 import numpy as np
2)List转成Numpy.ndarray:有时候有些类型数据你不能直接计算,但把它转成numpy结构的数据后就可直接计算了,也就是说numpy已经封装好很多实现了。例如定义了一个list=[1,2,3,4,5],你不能直接对这个list结构中的数据都加1(list +=1);但如果把这list转成numpy里的ndarray类型数据后就可直接加1了。例如 array=np.array([1,2,3,4,5])
print(type(array))
print(array +=1)
这里只是举例了一个加法,同理减法,除法,乘法也一样的道理的。还可以加逻辑判断生成一个新的bool类型的数组呢,最后可用bool值为true对应的值取出来。例如
array=np.array([1,2,3,4,5])
markbool=array>2
print(markbool)
array1=array[markbool]
print(array1)
最终会打印出[3,4,5]来。
那如果我要找到bool值为true对应值的索引位置,怎么办?答案是调用np的where方法。例如
例如
array=np.array([1,2,3,4,5])
markbool=array>2
index=np.where(markbool)
print(index)
3)两个ndarray相加。对应位置上的值进行相加。例如 array1=np.array([1,2,3,4,5])
array2=np.array([0,3,5,4,1])
print(array1+array2)
4)两个ndarray相乘。对应位置的数进行相乘。例如
array1=np.array([1,2,3,4,5])
array2=np.array([0,3,5,4,1])
print(array1*array2)
5)按索引号取出相应元素的值:
例如
array1=np.array([1,2,3,4,5])
print(array1[2])
6)调用ndarray多个属性。例如常用的shape与ndim。
<1>属性shape与定位某个元素
1>shape:表示ndarray中存有几行几列的数据
例如
array1=np.array([1,2,3,4,5])
print(array1.shape)
这个一维的话,打印出来的shape值是(5,)。
如果是二维就会实际多少维就打印出多少行多少列的值。如果是三维的话就会打印出多少行多少行多少列的值。这里的行是指某个维度下有多少样本(例一维数组表示一个样本)。如果是四维的话就会打印出多少行多少行多少行多少列的值。
2>具体定位某个元素。如果是3维数据,那要用[ ][ ][ ]这三组中括号定位到貝体的某一个值,例如[2][1][1]表示第一维的第3个元素(也许是第3个数组),第二维的第2个元素(也许是貝体到某一行的一维数组了),第三维的第2个元素(也许貝体到某一列了)。中括号里的值是索引值,从0开始算起。
<2>ndim:打印出是几维。多少维可从shape值中直观看出来(通过看最开头有几个 [ 就知道了)。注意维度是从最外层[开始算起(axis=0表示第一层),你可以算出每一个维度里有多少行数据就写到对应的shape里。
例如
array1=np.array([1,2,3,4,5])
print(array1.ndim)
也可以用len(array1.shape)得到维度数。
(2)Array数组
1)属性调用
<1>dtype:得到存的数据的貝体类型
例如
array1=np.array([1,2,3,4,5])
print(array1.dtype)
numpy的ndarray下存的数据都是同一类型的,若有不同类型,它会自动向下转型的。例如:
array1=np.array([1,2,3,4,5.0])
print(array1)
print(array1.dtype)
上例中把最后一个5变成5.0后,其它前面的值都会统一转成float类型的。
<2>size:里面一共有多少个元素。例如
array1=np.array([1,2,3,4,5.0])
print(array1.size)
如果是3行3列的二维数据,那它的size值就是3*3=9了。
2)方法调用
<1>fill(新值):把ndarray中的值全部更新成新值。
例如
array1=np.array([1,2,3,4,5.0])
print(array1.fill(0))
<2>切片,即按冒号(:)指定索引区间并取值。索引都是从0开始计算的。
例如
array1=np.array([1,2,3,4,5])
print(array1[1:3])
(3)数组结构
1)矩阵格式(多维形式)
例如
array1=np.array([[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]),这样就创建了一个2维矩阵了,这个矩阵是由3行5列组成,所以叫做3行5列的二维矩阵。其中第一维是三个子数组组成,分别是[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5];第二维是有5列组成。
2)矩阵取某个值
<1>可以按前面的所说的几维就按几个中括号[]来表示。例如array1=np.array([[1,2,3,4,5],[10,20,30,40,50]]),这个是二维的,所以array1[1][2]就会取到第2行第3列那个元素的值,是30
<2>对<1>简化,每一维之间用逗号分开(,),例如array1=np.array([[1,2,3,4,5],[10,20,30,40,50]]),如果用array1[1,2]也是取到30,与array1[1][2]结果一样。那如果对于这二维的,如果没有逗号只一个值就表示是取第一维的那一行(样本),例如array1[1]表示取到第二行数据[10,20,30,40,50]。
<3>既然按索引取值,那么就少不了切片(:)来取值,但维度还是用,分开的。例如array1=np.array([[1,2,3,4,5],[10,20,30,40,50]]),如果用array1[:,1]就表示一维来说可取任意的行,二维来说是取第二列,所以array1[:,1]取到的值是[2,20]。那又例如array1[0,0:2]就表示取第一行的前二列的数据为[1,2]。
<4>可按bool值为true对应位置的值取出来。先构建出数据array1=np.array([1,2,3,4,5])
,然后构建出bool类型的数据mark=np.array([1,0,0,1,0],dtype=bool),注意这里指定bool类型的话,大于0的数值都表示true,这个mark的shape与上面的数据array1的shape要一致。最后调用array1[mark]就会得到true对应的值,即得到[1,4]。
3)矩阵赋值
<1>例如array1=np.array([[1,2,3,4,5],[10,20,30,40,50]]),
array2=array1
这样array2会指向array1同一个内存,如果去操作array2,也会相当操作了array1,它没有单独创建出一个array2对象出来,这与我们想像的不一样。
<2>对<1>的解决方法:在赋值过程时,先对原来的矩阵调用copy()方法。相当于先创建一个内存空间,然后把值复制过去,这样两个矩阵间就相互独立,互不干扰了。
例如array1=np.array([[1,2,3,4,5],[10,20,30,40,50]]),
array2=array1.copy()
4)arange(起始值,结束值,相隔多少):构建一个等差数组.例如array1=np.arange(0,100,10)
(4)数组类型
1)dtype:定义时dtype指定数据的数型。例如
array=np.array([1,0,0,1,0],dtype=np.float32)
如果dtype=np.object的话,里面的数据不会向下统一转成同一类型的,可存混合类型的数据,但这样不方便计算,不推荐这样指定。
2)asarray(原数组,dtype=新类型):可以把原数组类型转成新类型的数组。例如array1=np.array([1,2,3,4,5])
array2=np.asarray(array1,dtype=np.float32)
print(array2)
它也可以直接这样:原数组.astype(指定新类型),例如
array1=np.array([1,2,3,4,5])
array2=array1.astype(np.float32)
print(array2)
这二种方式都不会改变原来数组类型。
(5)数值运算
1)求和sum方法
<1>计算矩阵中所有元素之和array1=np.array([[1,2,3,4,5],[1,2,3,4,5]])
value=np.sum(array1)
print(value)
<2>计算矩阵中某一个轴(维度)之和
array1=np.array([[1,2,3],[1,2,3]])
value=np.sum(array1,axis=0)
print(value)
这样打印出的值是[1+1,2+2,3+3],这个就是按列算出和来。同理像对于二维数组若按行轴计算和就只需把axis=0改成1就行。例如
array1=np.array([[1,2,3],[1,2,3]])
value=np.sum(array1,axis=1)
print(value)
这样打印出的值是[1+2+3,1+2+3]
那在高维中,若要按最后一轴来计算,那就用-1表示。
2)求积prod方法
<1>所有数相乘直接用prod()方法。例如
array1=np.array([[1,2,3,4,5],[1,2,3,4,5]])
value=np.prod(array1)
print(value)
<2>计算矩阵中某一个轴(维度)的乘积
array1=np.array([[1,2,3],[1,2,3]])
value=np.prod(array1,axi