matplotlib画图,numpy处理数值型数据,pandas在numpy基础上处理所有数据类型
numpy是python的一个基础库,重在数值计算,多用于在大型、多维数组上执行数值运算
1.创建数组(矩阵)
# 创建数组
import numpy as np
a=np.array( [1,2,3,4,5], dtype='int64')
b=np.array( range(1,6), dtype='float32')
c=np.arange(1, 6, 步长, dtype=数据类型)
print(b.dtype)
#astype是返回一个修改后的数组
d=c.astype(np.int8)
d=c.astype('int8')
#random方法返回随机生产的一个[0,1)内的实数
import random
random.random()
numpy.round(数据,保留几位)
#随机生成有10个数的数组
import numpy, random
e=np.array([random.random() for i in range(10)])
#保留两位小数
e1=np.round(e,2)
2.数组的维度
#数组名.shape显示数组是几行几列几维的
import numpy as np
a = np.array([ [1,2,3],[5,6,7] ]) #两行三列的二维数组
print(a.shape) #输出(2,3)
数组名.shape[0] #读取第二维(列)的长度
数组名.shape[1] #读取第一维(行)的长度
#返回一个修改数组维度后的数组
变量名.reshape( (x,y) ) #将数组修改成x行y列的二维数组
变量名.reshape( (x,y,z) ) #修改成x块y行z列的三维数组
三维数组:可以理解为有x幢楼,每幢楼y层,每层有z个住户
#二维降成一维
x*y=z
变量名.reshape( (z,) )
二维1行n列 与 一维 的区别:一维只有一个中括号,二维多了一个中括号
#当不知道数组内有几个个数,将其展成一维
变量名.flatten()
3.数组的计算
数组与一个数之间的计算
#广播机制
数组*n #数组里每个数都乘或除以n
数组 +/- n #数组里每个数都+/-n
0/0在numpy里得出结果nan,意味着这不是一个数
某个数/0得到inf,意味着无穷
数组与数组之间的计算
#同行同列同维的数组运算,同位置数据做加减乘除运算
数组a +/-/*/➗ 数组b
二维数组与二维数组计算:
例如shape为(3,3)的数组a只能与shape为(1,3)或(3,1)的数组b之间进行运算
依数组a的每行或每列运算过去,最终结果呈现为数组a的形状
三维与二维数组计算:
shape(x,y,z)与shape(y,z)、(1,z)、(y,1)的数组才能进行运算,即要末尾的维度一样
轴
轴在numpy中可以理解为方向,使用0,1,2...数字表示
对于一个一维数组,只有一个0轴;对于二维数组,有0轴和1轴 ;对于三维数组,有0,1,2轴
二维中:axis=0为跨行,即按列操作,从上到下;axis=1从左到右
三维中:axis=0为从外到内,1为从上到下,2为从左到右
#总计求和
numpy.sum(数组名,axis=)
import numpy as np
a = np.arange(0,24).reshape((4,6))
print(a)
print(np.sum(a)) #整个数组所有数据求和
print('--------------------')
print(np.sum(a,axis=0)) #竖向进行运算,输出一维相加结果数组
print('--------------------')
print(np.sum(a,axis=1)) #横向进行运算,输出一维相加结果数组
'''
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
276
--------------------
[36 40 44 48 52 56]
--------------------
[ 15 51 87 123]
'''
5.索引和切片
#取行
数组名[行数]
#取连续的多行
数组名[起始行:终止行, : ]
#取不连续的行
数组名[ [行数1,行数2,行数3], : ]
#取列
数组名[ : , 列数]
#取连续的多列
数组名[ : , 起始列:终止列]
#取不连续多列
数组名[ : , [列数1,列数2,列数3] ]
逗号前是行,逗号后是列
#取某行某列(例:取第3行第4列的值)
print ( a [ 2, 3 ] )
#取多行和多列(例:取第3行到第5行且第2列到第4列的结果)
print ( a [2:5, 1:4] )
#取多个不相邻的值(例:取坐标为(0,0)、(2,1)、(2,3)的值)
print ( a [ [0,2,2], [0,1,3] ] )
6.布尔索引
数组名 条件 #数组内每个数据进行条件判断,返回全是bool值的数组
数组名 [ 数组名与条件 ] #返回数组内所有满足条件的数据,reshape成一维数组返回
数组名 [ 数组名与条件 ] = 数值 #将满足条件的值都进行替换
import numpy as np
a = np.arange(0,24).reshape((4,6))
print(a < 10) #小于10的为True
print ( a[a<10] ) #返回数组a中小于10的数据,自动reshape成一维数组
a [a<10] = 3 #小于10的值都替换成3
print(a)
#不会改变原数组
numpy.where(条件, True的数据返回的值, False的数据返回的值)
import numpy as np
a = np.arange(0,24).reshape((4,6))
print(np.where(a < 10, 3, 30))
np.where(a < 10, 3, 30) #不会改变原数组
print(a)
clip替换值
#不会改变原数组
数组名.clip(小于该值的数据被替换成该值,大于该值的数据被替换成该值)
import numpy as np
a = np.arange(0,24).reshape((4,6))
a.clip(10,18)
b=a.clip(10,18)
print(a)
print(b)
7.nan与inf
nan:not a number
nan是一个float类型
当提取本地文件类型为float,如果数据缺失就会出现nan;当做了一个不合适的计算,也会出现nan
nan和任何值的计算都是nan
两个任意nan是不相等的;np.nan!=np.nan
#统计数组内有几个数据是0
numpy.count_nonzero(数组名)
#返回数组内是nan的数据为True,其它为False
numpy.isnan(数组名)
#统计数组里有几个nan值
numpy.count_nonzero(numpy.isnan(数组名))
#统计数组里有几个nan值
numpy.count_nonzero(数组名!=数组名)
数组!=数组会显示该数组内是nan的值为False,而True是1、False是0,因此通过数nonzero可以得出数组内有几个nan值
将nan值替换为平均值
import numpy as np
a = np.arange(0,24).reshape((4,6))
a = a.astype ('float')
a[1,2:] = np.nan
print(a.shape[1]) #返回6,即行的长度6列
def fillnan(ar):
for i in range( ar.shape[1] ): #遍历每一列,range()即有几列遍历几次
a0 = ar[ :, i ] #当前的一列
nan_num = np.count_nonzero( a0!=a0 )
if nan_num != 0: #不为0,说明这一列中有nan
not_nan_a0 = a0[ a0==a0] #当前一列没有nan的数组,bool索引
#选中当前为nan的位置,把值赋为不为nan的均值
a0[ np.isnan(a0)] = not_nan_a0.mean()
return ar
print(a)
a=fillnan(a)
print(a)
import numpy as np
a = np.arange(0,24).reshape((4,6))
a = a.astype('float') #nan是浮点类型,因此先将数组转化为float类型
a[3,3]=np.nan #将第4行第4列数据转成nan
print(a)
shape[1]表示t1这个数列的列数。shape[0]表示行数
inf:infinity
也是一个float类型
8.读取本地数据
loadtxt (fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
9.数组的拼接、行列交换
拼接
#竖直拼接
numpy.vstack( (数组1,数组2) )
#水平拼接
numpy.hstack( (数组1,数组2) )
行列交换
#行交换
数组名[ [行1,行2], : ] = 数组名[ [行2,行1], : ]
#列交换
数组名[ : , [列1,列2] ] = 数组名[ : , [列2,列1] ]
10.numpy其它方法
#获取最大值最小值位置
numpy.argmax(数组名, axis=0) #(每列中最大值位置)
numpy.argmin(数组名, axis=1) #(每行中最小值位置)
#创建一个全为0的数组
numpy.zeros( (行数,列数) )
#创建一个全为1的数组
numpy.ones( (行数,列数) )
#创建一个对角线全为1的正方形数组
numpy.eye(行数)
numpy生成随机数
numpy.random.seed(s)
#参数即种子的编号
#随便一个数字作为种子,种子号不变的情况下范围和类型都一样的取随机数结果不变
import numpy as np
np.random.seed(10)
t = np.random.randint(0,20, (3,4))
print(t) #重复运行会得到一样的数组t的值
11.numpy注意点
a = b a与b两个变量之间是相互影响的
a = b[ : ] 视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管。a与b的的数据变化是一致的
a = b.copy() a与b互不影响