numpy学习
文章目录
为什么要学习numpy
1、快速
2、方便
3、科学计算的基础库
1、什么是numpy
一个在python中做科学计算的基础库,重在数值计算,也是大部分python科学计算库的基础库,多用于在大型、多维数组上执行数值运算
2、numpy基础
3、numpy常用方法
4、numpy常用统计方法
import numpy as np
import random
# 使用numpy生成数组,得到ndarray的类型
# t1 = np.array([1,2,3])
# print(t1)
# print(type(t1))
#
# t2 = np.array(range(10))
# print(t2)
# print(type(t2))
#
# t3 = np.arange(4,10,2)
# print(t3)
# print(type(t3))
#
# print(t3.dtype)
# 创建数组
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)
print(a)
print(b)
print(c)
print(type(a))
print(a.dtype)
d = np.array(range(1,4))
print(d)
print(type(d))
print(d.dtype)
print()
t5 = np.array([1,1,0,1,0,0],dtype=bool)
print(t5)
print(type(t5))
print(t5.dtype)
print()
t6 = t5.astype("int32")
print(t6)
print(t6.dtype)
print()
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
print()
# 保留2位小数
t8 = t7.round(2)
print(t8)
数据类型的操作
数组的形状
这里发现PyCharm中无法使用reshape函数,但可以在console中使用
且reshape函数不主动进行赋值。
数组和数组的计算
广播原则:如果两个数组的后缘维度,即从末尾开始算起的维度的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失和长度为1的维度上进行。
怎么理解呢?可以把维度指的是shape所对应的数字个数
那么问题来了?
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?
有什么好处呢?
例如:每列的数据减去列的平均值的结果
数组的轴
关于轴(axis)
在numpy中可以理解为方向,使用0,1,2数字表示,对于一个一维数组,只有一个0轴,对于2维数组,有0轴和1轴,对于三维数组,有0,1,2轴
有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值,那么问题来了:
在前面的知识,轴在哪里?
numpy读取数据
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
numpy读取和存储数据
现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量([“views”,“likes”,“dislikes”,“comment_total”])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作
读取数据并对读取的数据矩阵进行转置
import numpy as np
us_file_path ="US_video_data_numbers.csv"
uk_file_path ="GB_video_data_numbers.csv"
t1 = np.loadtxt(us_file_path,dtype=int,delimiter=",",unpack=True)
t2 = np.loadtxt(us_file_path,dtype=int,delimiter=",")
print(t1)
print("**************************")
print(t2)
numpy中矩阵的转置
numpy索引和切片
import numpy随机 as np
us_file_path ="US_video_data_numbers.csv"
uk_file_path ="GB_video_data_numbers.csv"
t1 = np.loadtxt(us_file_path,dtype=int,delimiter=",")
# t2 = np.loadtxt(us_file_path,dtype=int,delimiter=",")
# print(t1[2:4])# 打印第三行和第四行
# print("**************************")
# print(t2)
'''取不连续的多行'''
# print(t1[0,2,4]) 报错 IndexError: too many indices for array: array is 2-dimensional, but 3 were indexed
'''正确的取多行'''
# print(t1[[0,2,4]])
# [[4394029 320053 5931 46245]
# [5845909 576597 39774 170708]
# [1168130 96666 568 6666]]
# 取列
# print(t1[:,2])
# 取多行和多列,取第3行到第5行,第2列到第4列的结果
# print()
# print(t1[2:5,1:4])
# 取出多个不相邻的点
# 选取的结果是 (0,0)(2,1)(2,3)
c = t1[[0,2,2],[0,1,3]]
print(c)
numpy中数值的修改
import numpy随机 as np
import matplotlib
from matplotlib import pyplot as plt
us_file_path ="US_video_data_numbers.csv"
uk_file_path ="GB_video_data_numbers.csv"
t_us = np.loadtxt(us_file_path,dtype=int,delimiter=",")
# print(t_us)
# 取评论的数据
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 =10000
bin_nums = (t_us_comments.max()-t_us_comments.min())//100
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comments,bin_nums)
plt.show()
numpy中数值的修改
numpy中布尔索引
nump中三元运算符
numpy中的裁剪
numpy中的nan和inf
numpy中的nan的注意点
nan的注意点
numpy中常用统计函数
ndarry缺失值填充均值
import numpy随机 as np
t1 = np.arange(12).reshape((3,4)).astype("float")
# print(t1)
t1[1,2:]=np.nan
# print(t1)
def fill_ndarray(t1):
nan_num = 0
for i in range(t1.shape[1]):
temp_col = t1[:,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的位置,把值赋值为不为nan的均值
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
return t1
print(t1)
print(fill_ndarray(t1))
小结
如何选择一行或者多行的数据(列)?
如何给选取的行或者列赋值?
如何大于把大于10的值替换为10?
np.where如何使用?
np.clip如何使用?
如何转置(交换轴)?
读取和保存数据为csv
np.nan和np.inf是什么
常用的统计函数你记得几个?
标准差反映出数据的什么信息
英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图
希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图
数据的拼接
import numpy随机 as np
us_file_path ="US_video_data_numbers.csv"
uk_file_path ="GB_video_data_numbers.csv"
# 加载国家数据
us_data = np.loadtxt(us_file_path,delimiter=",",dtype=int)
uk_data = np.loadtxt(uk_file_path,delimiter=",",dtype=int)
# 添加国家信息
# 构造全为0的数据
zeros_data = np.zeros((us_data.shape[0],1)).astype(int)
ones_data = np.ones((uk_data.shape[0],1)).astype(int)
# 分别添加一列全为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)