目录
什么是numpy
numpy一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
numpy的常用方法
1.使用numpy生成数组,得到ndarray的类型
t1=np.array([1,2,3])
print(t1)
print(type(t1)) #<class 'numpy.ndarray'>
t2=np.array(range(10))
print(t2)
print(type(t2))
t3=np.arange(12) #跟range一样,快速生成数组
print(t3)
print(type(t3))
print(t3.dtype) #int32
2.numpy的数据类型
t4=np.array(range(1,4),dtype=float) #dtype指定类型
print(t4)
print(t4.dtype) #float64
t5=np.array([1,1,0,1,0,0],dtype=bool)
print(t5)
print(t5.dtype) #bool
3.调整数据类型
t5=np.array([1,1,0,1,0,0],dtype=bool)
t6=t5.astype('int8')
print(t6)
print(t6.dtype)
4.numpy中的小数
t7=np.array([random.random() for i in range(10)]) #产生10个0到1的随机数
print(t7)
print(t7.dtype)
t8=np.round(t7,2) #取小数点后两位
print(t8)
5.数组形状
t1=np.arange(12)
print(t1.shape) #当只有一行时,表示的是个数 一维
t2=np.array([[1,2,3],[4,5,6]])
print(t2.shape) #当有2两行时,表示几行几列 二维
t3=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) #三维
print(t3.shape) #(2,2,3) 第一个2是两块 第二个是2行 第三个是3列
t4=np.arange(12)
print(t4.reshape(3,4)) #reshape改变数组形状,可以传元组进去操作
t5=np.arange(24)
print(t5.reshape(2,3,4))
print(t5.reshape(4,6))
print(t5.flatten()) #变为一维数组
6.数组的计算
t5=np.arange(24)
t6=t5.reshape(4,6)
print(t6)
#print(t6+2) #每个数都+2 ,当数组跟数组都是对应位置相加
#print(t6/0) #nan不是一个数 和 inf无穷大
t7=np.arange(0,6)
print(t6-t7) #每一行对应相减
7.转置
t1=np.arange(24)
t2=t1.reshape(4,6)
print(t2.transpose()) #transpose进行转置
print(t2.T) #T转置
print(t2.swapaxes(1,0))#swapaxes转置 默认是swapaxes(0,1)
8.转换成nan
t1=np.arange(24)
t2=t1.reshape(4,6)
t2=t2.astype(float) #必须要转换为浮点类型,才能转换为nan,因为nan是浮点类型
t2[3,3]=np.nan
print(t2)
需要注意的是两个nan是不相等的。
9.统计nan的个数
t1=np.arange(24)
t2=t1.reshape(4,6)
t2=t2.astype(float) #必须要转换为浮点类型,才能转换为nan,因为nan是浮点类型
t2[3,3]=np.nan
t2[:,0]=0 #第一列为0
print(np.count_nonzero(t2)) #计算其中不为0数字的个数
print(np.count_nonzero(t2!=t2)) #1个 只有nan哪t2!=t2
print(np.isnan(t2)) #判断那个是nan--True
print(np.count_nonzero(np.isnan(t2))) #1
nan与任何数计算都是nan。
10.nan中常用的统计函数
t1=np.arange(24)
t2=t1.reshape(4,6)
t2=t2.astype(float) #必须要转换为浮点类型,才能转换为nan,因为nan是浮点类型
t2[3,3]=np.nan
t2[:,0]=0 #第一列为0
print(t2.sum(axis=0)) #每一行相加
print(t2.mean(axis=0)) #求均值
print(np.median(t2,axis=0)) #求中值
print(t2.max(axis=0)) #最大值
print(t2.min(axis=0)) #最小值
print(np.ptp(t2,axis=0))#求极值--最大值和最小值之差
print(t2.std(axis=0)) #求标准差 --反应平均数的分散程度
11.创建一个方正
print(np.eye(3))
12.获取最大值和最小值的位置
t=np.eye(4)
print(np.argmax(t,axis=0))
t[t==1]=-1
print(t)
print(np.argmin(t,axis=1))
13.产生随机数
print(np.random.randint(10,20,(4,5))) #创建一个4行5列每个数都是从10到20的
np.random.seed(10) #加上这种方法后下次得到的数跟上次是一样的
print(np.random.randint(10,20,(4,5)))
numpy的数据读取
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
举例:
import numpy as np
us_file_path='./youtube_video_data/US_video_data_numbers.csv'
uk_file_path='./youtube_video_data/GB_video_data_numbers.csv' #本地数据
t1=np.loadtxt(us_file_path,delimiter=',',dtype='int') #读取数据 delimiter按逗号分隔
t2=np.loadtxt(us_file_path,delimiter=',',dtype='int',unpack=True) #unpack-转置
print(t1)
print('*'*100)
#print(t2)
以上面读取的t1为例,来学习numpy中的索引和切片
取行:
print(t1[2]) #取第三行
取连续的多行
print(t1[2:])
取不连续的多行
print(t1[[2,7,10]])
取行的方法二
print(t1[1,:]) #第二行每一列都要
print(t1[2:,:])#从第二行开始每一列都要
取列
print(t1[:,0]) #第一列
取连续多列
print(t1[:,2:])
取不连续多列
print(t1[:,[0,2]])
取行和列--取第三行,第四列的值
print(t1[2,3])
取多行多列--取第三行到第五行,第二列到第四列的结果
print(t1[2:5,1:4])
取多个不相邻的点
print(t1[[0,2],[0,1]]) #(0,0) (2,1)
修改t1中的数
t1[t1<10]=3
print(t1)
where用法
print(np.where(t1<=3,100,200)) #把t2中小于3的替换成100,否则为200
clip用法
print(t1.clip(10,300)) #把小于10的替换成10,把大于300的替换成300
ndarry缺失值填充均值
import numpy as np
def fill_ndarray(t1):
for i in range(t1.shape[1]): #遍历列
temp_col=t1[:,i] #当前的一列
nan_num=np.count_nonzero(temp_col!=temp_col) #统计nan的个数
if nan_num != 0:
temp_not_nan_col=temp_col[temp_col==temp_col] #取出当前这一列不为nan的数字
temp_col[np.isnan(temp_col)]= temp_not_nan_col.mean() #选中当前为nan的位置,把值赋值为不为nan的均值
return t1
if __name__=='__main__':
t1=np.arange(12).reshape(3,4).astype('float')
t1[1,2:]=np.nan
print(t1)
t1=fill_ndarray(t1)
print(t1)
数据拼接
1.竖直拼接
import numpy as np
t1=np.arange(12).reshape(3,4)
t2=np.arange(12,24).reshape(3,4)
print(np.vstack([t1,t2])) #t1在上,t2在下
2.水平拼接
import numpy as np
t1=np.arange(12).reshape(3,4)
t2=np.arange(12,24).reshape(3,4)
print(np.hstack([t1,t2])) #水平拼接
3.行列交换
import numpy as np
t1=np.arange(12).reshape(3,4)
t2=np.arange(12,24).reshape(3,4)
#行列交换
t1[[1,2],:]=t1[[2,1],:]
print(t1)
例题
1.英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图
import numpy as np
from matplotlib import pyplot as plt
us_file_path='./youtube_video_data/US_video_data_numbers.csv'
uk_file_path='./youtube_video_data/GB_video_data_numbers.csv' #本地数据
t_us=np.loadtxt(us_file_path,delimiter=',',dtype='int') #读取数据 delimiter按逗号分隔
#t2=np.loadtxt(us_file_path,delimiter=',',dtype='int',unpack=True) #unpack-转置
#取评论数据
t_us_comments=t_us[:,-1]
#选择比5000下的数据
t_us_comments=t_us_comments[t_us_comments<=5000]
print(t_us_comments.max(),t_us_comments.min())
d=250 #组距
num_bins=(t_us_comments.max()-t_us_comments.min())//d #组数
#绘图
plt.hist(t_us_comments,num_bins)
plt.show()
2.希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图
import numpy as np
from matplotlib import pyplot as plt
us_file_path='./youtube_video_data/US_video_data_numbers.csv'
uk_file_path='./youtube_video_data/GB_video_data_numbers.csv' #本地数据
t_uk=np.loadtxt(uk_file_path,delimiter=',',dtype='int') #读取数据 delimiter按逗号分隔
#t2=np.loadtxt(us_file_path,delimiter=',',dtype='int',unpack=True) #unpack-转置
#选择喜欢数比500000小的数据
t_uk=t_uk[t_uk[:,1]<=50000]
#取评论数据
t_uk_comments=t_uk[:,-1]
t_uk_like=t_uk[:,1]
#绘图
plt.scatter(t_uk_like,t_uk_comments)
plt.show()
3.现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办
us_data='./youtube_video_data/US_video_data_numbers.csv'
uk_data='./youtube_video_data/GB_video_data_numbers.csv'
#加载国家数据
us_data=np.loadtxt(us_data,delimiter=',',dtype='int')
uk_data=np.loadtxt(uk_data,delimiter=',',dtype='int')
#添加国家信息
#构造全为0的数据
zeros_data=np.zeros((us_data.shape[0],1)).astype(int) #np.zeros()创建一个全为0的数组
ones_data=np.ones((uk_data.shape[0],1)).astype(int)#np.ones()创建一个全为1的数组
#分别添加一列全为0,1的数组
us_data=np.hstack((us_data,zeros_data))
uk_data=np.hstack((uk_data,ones_data))
#拼接两组数据
final_data=np.vstack((us_data,uk_data))
print(final_data)