Numpy
处理数值型数据
Numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
1、快速
2、方便
3、科学计算的基础库
numpy创建数组(矩阵)
import numpy as np
a=np.array([1,2,3,4,5])
b=np.array(range(1,6))
c =np.arange(1,6)
上面a,b,c内容相同,生成结果均为:[1 2 3 4 5]
arange 是Numpy自有的方法,生成数组。np.arange的用法:arange([start,]stop[,step,],dtype=None) 其中 dtype 是数据类型。
numpy中常见的更多数据类型
数据类型的操作
t4 = np.array(range(1,4),dtype="i1")
print(t4)
print(t4.dtype)
##numpy中的bool类型
t5 = np.array([1,1,0,1,0,0],dtype=bool)
print(t5)
print(t5.dtype)
#调整数据类型
t6 = t5.astype("int8")
print(t6)
print(t6.dtype)
#numpy中的小数
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
#保留小数
t8 = np.round(t7,2)
print(t8)
结果:
[1 2 3]
int8
[ True True False True False False]
bool
[1 1 0 1 0 0]
int8
[0.1514541 0.4459195 0.70139273 0.27353996 0.76353799 0.95684743
0.04539582 0.47790356 0.47407137 0.46033746]
float64
[0.15 0.45 0.7 0.27 0.76 0.96 0.05 0.48 0.47 0.46]
数组的形状
查看数组的形状 a.shape()
修改数组的形状 a.reshape(3,4)
展开成一维数组 a.flatten()
数组和数的计算
numpy的广播机制 在运算过程中,加减乘除的值被广播到所有的元素上面。
轴(axis)
在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴。
二维数组的轴
三维数组的轴
numpy读取数据
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
Numpy中的转置
对于numpy中的数组来说,转置是在对角线方向交换数据,目的也是为了更方便的去处理数据。
三种方式:t.transpose() ; t.swapaxes(1,0) #; t.T
numpy索引和切片
取行一般冒号在后面或者后面冒号省略;取列一般冒号在前或者前面冒号省略
# coding=utf-8
import numpy as np
file_name = r'gb_videos_data_numbers.csv'
a=np.loadtxt(file_name,dtype='int', delimiter=",")
print(a)
print("*"*100)
#取一行
print(a[1])
print("*"*50)
#取连续的多行
print(a[2:])
print("*"*50)
#取不连续的多行(取第1、8、10行)
print(a[[0,7,9]])
print("*"*50)
#取连续多列
print(a[:,2:])
print("*"*50)
#取行和列(取第3行第四列的值)
print(a[2,3])
print("*"*50)
#取多行多列(取第三行到第五行,第二列到第四列)
print(a[2:5,1:4])
print("*"*50)
#取多个不相邻的点
#选出来的结果是(0,0)(2,1)(2,3)
print(a[[0,2,2],[0,1,3]])
结果:
[[1231231 78240 13548 705]
[ 494203 2651 1309 0]
[ 142819 13119 151 1141]
…
[ 379570 7277 88 336]
[ 17141 922 8 59]
[ 79278 2137 19 173]]
[494203 2651 1309 0]
[[ 142819 13119 151 1141]
[1580028 65729 1529 3598]
[ 40592 5019 57 490]
…
[ 379570 7277 88 336]
[ 17141 922 8 59]
[ 79278 2137 19 173]]
[[ 1231231 78240 13548 705]
[10532409 384841 7547 23849]
[ 751743 42272 358 3250]]
[[13548 705]
[ 1309 0]
[ 151 1141]
…
[ 88 336]
[ 8 59]
[ 19 173]]
1141
[[13119 151 1141]
[65729 1529 3598]
[ 5019 57 490]]
[1231231 13119 1141]
numpy中数值的修改
import numpy as np
>>> t = np.arange(24).reshape((4,6)) #生成4行6列的二维数组
>>> t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> t[:,2:4] #取数组的第3~4列
array([[ 2, 3],
[ 8, 9],
[14, 15],
[20, 21]])
>>> t[:,2:4] = 0 #修改行列的值
>>> t
array([[ 0, 1, 0, 0, 4, 5],
[ 6, 7, 0, 0, 10, 11],
[12, 13, 0, 0, 16, 17],
[18, 19, 0, 0, 22, 23]])
numpy中布尔索引
import numpy as np
>>> t = np.arange(24).reshape((4,6)) #生成4行6列的二维数组
>>> t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> t<10
array([[ True, True, True, True, True, True],
[ True, True, True, True, False, False],
[False, False, False, False, False, False],
[False, False, False, False, False, False]])
>>> t[t<10]=0 #把t中小于10的数字替换为0
>>> t
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
numpy中三元运算符
#把t中小于10的数字替换为0,把大于10的替换为10
>>> t = np.arange(24).reshape((4,6))
>>> t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> np.where(t<10,0,10) #numpy的三元运算符
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 10, 10],
[10, 10, 10, 10, 10, 10],
[10, 10, 10, 10, 10, 10]])
numpy中的clip(裁剪)
#把t中小于10的数字替换为0,把大于20的替换为20
>>> t = np.arange(24).reshape((4,6))
>>> t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> t.clip(10,18)
array([[10, 10, 10, 10, 10, 10],
[10, 10, 10, 10, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 18, 18, 18, 18, 18]])
numpy中的nan和inf
NAN的赋值为a=np.nan
type(a)
float
nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
1、两个NAN是不相等的
>>> np.nan == np.nan
False
2、 利用np.nan != np.nan ,判断数组中nan的个数,利用 np.count_nonzero() 方法
>>> t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> t[:,0]=0
>>> t
array([[ 0, 1, 2, 3, 4, 5],
[ 0, 7, 8, 9, 10, 11],
[ 0, 13, 14, 15, 16, 17],
[ 0, 19, 20, 21, 22, 23]])
>>> np.count_nonzero(t)
20
>>> t = t.astype(float)
>>> t
array([[ 0., 1., 2., 3., 4., 5.],
[ 0., 7., 8., 9., 10., 11.],
[ 0., 13., 14., 15., 16., 17.],
[ 0., 19., 20., 21., 22., 23.]])
>>> t[3,4]=nan
>>> t
array([[ 0., 1., 2., 3., 4., 5.],
[ 0., 7., 8., 9., 10., 11.],
[ 0., 13., 14., 15., 16., 17.],
[ 0., 19., 20., 21., nan, 23.]])
>>> t!=t
array([[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, True, False]])
>>> np.count_nonzero(t!=t)
1
3、 利用np.nan != np.nan ,判断一个数字是否为nan,利用 np.isnan() 方法 ,返回bool类型
>>> np.isnan(t)
array([[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, True, False]])
>>> t[isnan(t)]=0 #把nan替换为0
>>> t
array([[ 0., 1., 2., 3., 4., 5.],
[ 0., 7., 8., 9., 10., 11.],
[ 0., 13., 14., 15., 16., 17.],
[ 0., 19., 20., 21., 0., 23.]])
4、nan和任何值计算都是nan
>>> t
array([[nan, 1., 2., 3., 4., 5.],
[nan, 7., 8., 9., 10., 11.],
[nan, 13., 14., 15., 16., 17.],
[nan, 19., 20., 21., nan, 23.]])
>>> np.sum(t)
nan
numpy中常用统计函数
求和:t.sum(axis=None)
>>> t = np.arange(12).reshape(3,4)
>>> t
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.sum(t)
66
>>> t.sum(axis=0) #也可写为np.sum(t,axis=0) 横向和,与行的形状一样
array([12, 15, 18, 21])
>>> t.sum(axis=1) #也可写为np.sum(t,axis=1) 纵向和,与列的形状一样
array([ 6, 22, 38])
>>>
均值: t.mean(a,axis=None) 受离群点的影响较大
中值: np.median(t,axis=None)
最大值: t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) 即最大值和最小值之差
标准差:t.std(axis=None)
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,越不稳定。
默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果。
ndarry缺失值填充均值
# coding=utf-8
import numpy as np
def fill_ndarray(t):
for i in range(t.shape[1]): #遍历每一列
temp_col = t[:,i] #当前的一列
nan_num = np.count_nonzero(temp_col!=temp_col)
if nan_num !=0: #不为0,说明当前这一列中有nan
temp_not_nan_col = temp_col[temp_col == temp_col] #当前一列不为nan的array
#选中当前为nan的位置,把值复制为不为nan的均值
temp_col[np.isnan(temp_col)] =temp_not_nan_col.mean()
return (t)
if __name__ == '__main__':
t = np.arange(12).reshape(3, 4).astype("float")
t[1, 2:] = np.nan
print(t)
print("*"*10)
t = fill_ndarray(t)
print(t)
数组的拼接
>>> t1 = np.arange(12).reshape(2,6)
>>> t1
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> t2 = np.arange(12,24).reshape(2,6)
>>> t2
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> np.vstack((t1,t2)) #竖直拼接
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> np.hstack((t1,t2)) #水平拼接
array([[ 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17],
[ 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23]])
竖直分割与竖直拼接互为逆过程
数组的行列交换
竖直拼接的时候:每一列代表的意义相同!!!如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同。
>>> t = np.arange(12,24).reshape(3,4)
>>> t
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
>>> t[[1,2],:] =t[[2,1],:] #行交换
>>> t
array([[12, 13, 14, 15],
[20, 21, 22, 23],
[16, 17, 18, 19]])
>>> t[:,[0,2]] = t[:,[2,0]] #列交换
>>> t
array([[14, 13, 12, 15],
[22, 21, 20, 23],
[18, 17, 16, 19]])
numpy更多好用的方法
1、获取最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)
2、创建一个全0的数组: np.zeros((3,4))
3、创建一个全1的数组:np.ones((3,4))
4、创建一个对角线为1的正方形数组(方阵):np.eye(3)
>>> np.ones((2,3))
array([[1., 1., 1.],
[1., 1., 1.]])
>>> np.zeros((4,3))
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>> np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
>>> t
array([[ 9, 4, 15, 0],
[17, 16, 17, 8],
[ 9, 0, 10, 8]])
>>> np.argmax(t) #没有axis数组会被展开,沿着最后的轴排序
4
>>> np.argmax(t,axis=0) #行方向上 每一列最大值的位置
array([1, 1, 1, 1], dtype=int64)
>>> np.argmax(t,axis=1) #列方向上 每一行最大值的位置
array([2, 0, 2], dtype=int64)
>>> np.argmin(t,axis=0) #行方向上 每一列最小值的位置
array([0, 2, 2, 0], dtype=int64)
>>> np.argmin(t,axis=1) #列方向上 每一行最小值的位置
array([3, 3, 1], dtype=int64)
numpy生成随机数
>>> np.random.seed(10) #作用是保持种子结果不变
>>> t = np.random.randint(0,20,(3,4))
>>> t
array([[ 9, 4, 15, 0],
[17, 16, 17, 8],
[ 9, 0, 10, 8]])
numpy的注意点copy和view
1、a=b 完全不复制,a和b相互影响
2、a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的
3、a = b.copy(),复制,a和b互不影响