什么是numpy
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算
轴(axis)
在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴
有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值 创建数组:
修改数组的形状 数组间运算 转置矩阵
numpy读取数据 CSV:Comma-Separated Value,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
numpy读取数据
numpy读取和存储数据
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"
t2 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
print(t2)
print("*"*100)
b = t2[2:5,1:4]
c = t2[[0,2,2],[0,1,3]]
print(c)
运行结果:
numpy中的布尔索引
numpy中的三元运算符
numpy中的nan和inf
nan(NAN,Nan):not a number表示不是一个数字
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大) inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷 什么时候回出现inf包括(-inf,+inf) 比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
numpy中的nan的注意点
1.两个nan是不相等的
2.np.nan!=np.nan 3.利用以上的特性,判断数组中的nan的个数
4.判断一个数字是否为nan通过np.isnan(a)来判断
5.nan和任何值计算都为nan
###numpy中常用统计函数 求和:t.sum(axis=None) 均值: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)
numpy中填充nan
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)
if nan_num !=0:
temp_not_nan_col = temp_col[temp_col==temp_col]
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
return t1
if __name__ == '__main__':
t1 = np.arange(24).reshape((4, 6)).astype("float")
t1[1, 2:] = np.nan
print(t1)
t1 = fill_ndarray(t1)
print(t1)
运行结果:
【动手】英国和美国各自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")
t_us_comments = t_us[:,-1]
t_us_comments = t_us_comments[t_us_comments<=5000]
print(t_us_comments.max(),t_us_comments.min())
d = 50
bin_nums = (t_us_comments.max()-t_us_comments.min())//d
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comments,bin_nums)
plt.show()
运行结果:
【动手】希望了解英国的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")
t_uk = t_uk[t_uk[:,1]<=500000]
t_uk_comment = t_uk[:,-1]
t_uk_like = t_uk[:,1]
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(t_uk_like,t_uk_comment)
plt.show()
运行结果:
数组的行列交换
数组水平或者竖直拼接很简单,但是拼接之前应该注意什么? 竖直拼接的时候:每一列代表的意义相同!!!否则牛头不对马嘴 如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同
【动手】现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办
import numpy as np
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)
zeros_data = np.zeros((us_data.shape[0],1)).astype(int)
ones_data = np.ones((uk_data.shape[0],1)).astype(int)
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)
运行结果:
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)
|