Python3科学计算库numpy

来源:互联网 发布:android 内存回收算法 编辑:程序博客网 时间:2024/06/07 06:09

把数据转换成矩阵的形式,用numpy封装函数对矩阵进行操作。

用numpy读写数据文件

example=open('drink.txt','w+') ##写一个数据文件drink.txtexample.write('Year,WHO_Region,Country,Beverage Types,Display Value\\n1986,Western Pacific,Viet Nam,Wine,0\\n1986,Americas,Uruguay,Other,0.5\\n1985,Africa,Cte d\'Ivoire,Wine,1.62')example.close()
example=open('drink.txt','r+')print(example.read())
import numpydrink=numpy.genfromtxt('drink.txt',delimiter=',')##genfromtxt读取数据集,存成array格式;delimiter是分割值,表示数组用什么来分割print(type(drink))

用numpy创建数组

(1)arange方法创建向量数组,reshape改变数组维度

import numpy as npA=np.arange(15)  #arange创建数组print(A)a=A.reshape(3,5)  #reshape定义数组维度大小print(a)ash=a.shape  #shape查看数组a各维度大小print(ash)print(a.ndim)   #ndim查看数组是几维的print(a.dtype.name)   #dtype.name查看数组内元素数据类型print(a.size)   #size查看数组里一共有多少元素

(2)zeros方法,创建全0数组,注意数组维度是括号

nz=np.zeros((3,4))  print(nz)no=np.ones((2,3,4),dtype=np.float32)print(no)

(3)random方法,创建随机数组

nr=np.random.random((2,3))  #np.random.random生成(0,1)间的随机数组print(nr)from numpy import pinpi=np.linspace(0,2*pi,10)   #linspace给定首尾间隔,等分print(npi)ns=np.sin(npi)  #sin对给定数组每个元素取正弦print(ns)

(4)array方法,创建向量矩阵

import numpyvector=numpy.array([5,10,15,20])  #array创建数组print(vector)matrix=numpy.array([[5,10,15],[20,25,30]])print(matrix)

shape方法,查取array数组维度

print(vector.shape)   #(4,)   4个元素的向量print(matrix.shape)   #(2, 3) 2行3列

dtype方法,查看类型

##numpy.array数据格式里的元素必须是相同数据类型的numbers=numpy.array([1,2,3,4])print(numbers.dtype)   
#bool(True,False)#int(int16,int32,int64)#float(float16,float32,float64)#string(string,unicode)

dtype参数,数据类型设置

import numpydrink=numpy.genfromtxt('drink.txt',delimiter=',')print(drink) #默认转换成浮点数,转换不成float格式,会出现值缺失表示nandrink1=numpy.genfromtxt('drink.txt',delimiter=',',dtype='str')  #dtype参数指定数据格式print(drink1)drink2=numpy.genfromtxt('drink.txt',delimiter=',',dtype='U75',skip_header=1)  #skip_header去掉第一行print(drink2)

astype方法,对数组元素类型转换

vector=numpy.array(["1","2","3"])print(vector.dtype);print(vector)vector=vector.astype(float)  #astype转换数据类型print(vector.dtype);print(vector)

对数组元素进行取值操作(分片)

getnum=drink2[1,4];getnum1=drink2[2,2]  #按索引号[行,列]取单个元素print(getnum);print(getnum1)vector=numpy.array([5,10,15,20])print(vector)print(vector[0:3])    #向量分片取值,取前3个值,索引“左闭右开”matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])print(matrix)print(matrix[:,1])    #矩阵取某一列print(matrix[:,0:2])  #矩阵分片取值,取前2列值,索引“左闭右开”print(matrix[1:3,0:2])#矩阵分片取值,取后2行的前2

对数组中元素进行整体操作(boolean)

vector=numpy.array([5,10,15,20])print(vector==10)     #对数组里的元素进行值判断equal_to_ten=(vector==10)  #这种变量相当于找到了一个“位置”,True表示位置print(equal_to_ten)   print(vector[equal_to_ten]) #对数组里的元素进行取值,只取True的值
matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])print(matrix==25)second_column_25=(matrix[:,1]==25)print(second_column_25)print(matrix[second_column_25,:]) #对数组取布尔值True确定的行
vector=numpy.array([5,10,15,20])print(vector)equal_to_ten_and_five=(vector==10)&(vector==5) #&与print(equal_to_ten_and_five)equal_to_ten_or_five=(vector==10)|(vector==5)  #|或print(equal_to_ten_or_five)vector[equal_to_ten_or_five]=50   #对True的位置赋值print(vector)
matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])second_column_25=matrix[:,1]==25print(second_column_25)matrix[second_column_25,1]=10     #对second_column_25的行的索引1位置元素赋值10print(matrix)

对数组中元素进行数值计算API

vector=numpy.array([5,10,15,20])vsum=vector.sum()   #求和print(vsum)vmax=vector.max()   #求最大值print(vmax)vmin=vector.min()   #求最小值print(vmin)vmean=vector.mean()   #求均值print(vmean)
matrix=numpy.array([[5,10,15],[20,25,30],[35,40,45]])mhsum=matrix.sum(axis=1)   #axis=1表示按行操作,axis=0表示按列操作print(mhsum)mlsum=matrix.sum(axis=0)print(mlsum)

nan值检测和替换

drink=numpy.genfromtxt('drink.txt',delimiter=',',skip_header=1)print(drink)is_value_empty=numpy.isnan(drink[:,3])  #isnan判断值是否是nan,返回布尔值print(is_value_empty)drink[is_value_empty,3]='0' #对is_value_empty是nan样本的第3索引"列"赋值‘0’#####print(drink)drink_3index_column=drink[:,3] #对第3索引"列"进行数据类型转换drink_3index_column=drink_3index_column.astype(float)drink_3index_column_sum=drink_3index_column.sum()drink_3index_column_mean=drink_3index_column.mean()print(drink_3index_column_sum)print(drink_3index_column_mean)

对两个数组进行操作

a=np.array([20,30,40,50])b=np.arange(4)c=a-bprint(a);print(b);print(c)print(b**2);print(a<35)A=np.array([[1,1],[0,1]]);print(A)B=np.array([[2,0],[3,4]]);print(B)print(A*B)  #对应元素内积print(A.dot(B))   #dot常规矩阵乘法print(np.dot(A,B))

对单个数组整体进行函数操作

import numpy as npB=np.arange(3)print(B)print(np.exp(B))  #exp对数组每个元素取e指数计算print(np.sqrt(B))  #sqrt对数组每个元素取平方根a=np.floor(10*np.random.random((3,4)));print(a) #floor向下取整print(a.shape)

ravel方法,对矩阵“拉长”

a=np.floor(10*np.random.random((3,4)));print(a) print(a.ravel())  #ravel矩阵按行拉长a.shape=(6,2)print(a);print(a.T)  #a.T对a数组取转置

vstack,hstack方法,对两个数组“拼接”

a=np.floor(10*np.random.random((2,2)))b=np.floor(10*np.random.random((2,2)))print(a),print(b)print(np.vstack((a,b))) #vstack将数组a,b竖直拼接verticalprint(np.hstack((a,b))) #hstack将数组a,b水平拼接horizontal

vsplit,hsplit方法,对数组“切分”

a=np.floor(10*np.random.random((2,12)))print(a)print(np.hsplit(a,3))  #hsplit将数组a在水平方向切分成3等分a1=np.floor(10*np.random.random((2,12)))print(a1)print(np.hsplit(a1,(3,4)))  #hsplit将数组a在水平方向切分,从列索引3前切,到列索引4前停止b=np.floor(10*np.random.random((12,2)))print(b)print(np.vsplit(b,3))  #vsplit将数组b在竖直方向切分成3等分

数组赋值后指向:直接赋值,浅复制,深复制

a=np.arange(12)b=aprint(b is a)   #赋值后,b和a指向同一个内存地址b.shape=3,4print('b维度变成(3,4)后a的维度:',a.shape)print('a的id:',id(a));print('b的id:',id(b))  #取a,b在内存里的idprint('_________________________________')c=a.view()   #c是对a的浅复制,两个数组不同,但数据共享print(c is a)c.shape=2,6print(a.shape); #c的形态变量,a的形态没变print('对c赋值前的a:\n',a);c[0,4]=1234;print('c:\n',c);print('对c赋值后的a:\n',a)  #c的[0,4]位置数据改变,a也改变print('_________________________________')d=a.copy()   #d是对a的深复制,两个数组不同,数据也不共享print(d is a)d[0,0]=9999print('d:\n',d);print('a:\n',a)print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')##在数组中找最大值的位置import numpy as npdata=np.sin(np.arange(20)).reshape(5,4)print('初始数据:\n',data)index=data.argmax(axis=0)  #argmax找每列的最大值位置print('每一列最大值的索引:',index)data_max=data[index,range(data.shape[1])] #根据索引index找出data数组里的元素!!!print('根据索引找出最大值:',data_max)print('直接办法取最大值:',data.max(axis=0)) #array.max(axis=0)print('检测两种办法取到的max是否一致:',all(data_max==data.max(axis=0)))print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')##对数组中元素“排序”print('(1.)sort方法作用类np上<对象参数a不变,生成数组新开辟空间给b>:')a=np.array([[4,3,5],[1,2,1]])print('np.sort对a进行行排序前的a:\n',a)b=np.sort(a,axis=1)  #sort对数组a里的元素按行排序print('对a进行行排序后的b:\n',b)print('np.sort对a进行行排序后的a:\n',a)print('a的id:',id(a));print('b的id:',id(b))print('(2.)sort方法作用对象a上,a被改变:')a.sort(axis=1)print(a)print('a的id:',id(a))print('_________________________________')#返回最大值的索引aa=np.array([0.4,0.3,0.1,0.2])print('初始aa数组:',aa)j=np.argsort(aa)print('对aa元素排序后的索引位置:',j)print('根据索引的排序对aa重排:',aa[j])print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')##对数组进行复制a=np.arange(0,40,10)print(a)b=np.tile(a,(4,1)) #tile对a进行4行1列的复制print(b)
原创粉丝点击