1. 什么是numpy
- numpy是一个在python中做科学计算的基础库,重在数值计算,也是大部分python科学计算库的基础库,多用于大型,多维数组上执行数值运算。
2. numpy基础
- 创建数组,得到ndarray的类型
- a = np.array([1,2,3,4,5])
- b = np.array(range(1,6))
- c = np.arange(1,6)
- arange相当于array(range())
- numpy中的数据类型
- 创建数组时,指定数据类型:a = np.array(range(1,4), dtype="int32")
- 查看数据类型:a.dtype
- 修改数据类型:a.astype("bool") or a.astype(np.bool)
- numpy中的小数
- a = np.array([random.random() for i in range(10)])
- 保留固定位位小数:b = np.round(a, 2),保留两位小数
- 数组的形状
- 查看数组的形状:a.shape
- 修改数组的形状:a.reshape(3,4)
- 注意:修改后的形状的元素个数要与修改前相等,否则无法修改。比如a数组的形状为一行12列,总元素个数为12个。修改后的形状为3行4列,总元素个数还是12个。
- 把数组转化为1维数据
- a.reshape(a.shape[0]*a.shape[1])
- a.flatten()
- 数组的计算
- 数组和数的运算
- 广播机制,跟数组中的每个元素进行运算
- 数组和数组的计算
- 形状相同,对应的位置作运算
- 某一维度上的形状相同,可以进行计算
- 形状完全不同,不可以进行计算
- 数组和数的运算
- 轴
- 在numpy中可以理解为方向,使用0,1,2...数字来表示。对于一个一维数组,只有一个0轴,对于2维数组,有0轴和1轴,对于三维数组,有0,1,2轴
3. numpy常用方法
- numpy读取数据
- CSV:Comma-Separated Value,逗号分隔值文件
- 显示:表格状态
- 源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
- 由于CSV便于展示,读取和写入,所以很多地方也是用CSV的格式存储和传输中小型的数据。
- np.loadtxt(fname, dtype=np.float, delimiter=None, skiprows=(),usecols=None,unpack=Flse)
参数 解释 frame 文件路径 dtype 数据类型,CSV的字符串以什么数据类型读入数组中,默认np.float delimiter 分隔字符串,默认是空格,改为逗号 skiprows 跳过前X行,一般跳过第一行表头 usecols 读取指定的列,索引,元祖类型 unpack 如果是True,相当于矩阵转置,默认为False -
什么是转置?
- 转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据。
- t.transpose()
- t.T
- t.swapaxes()
- 以上三种方法都可以实现矩阵转置。
-
现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量(["views","likes","dislikes","comment_total"])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作
import numpy as np us_path = "./youtube_video_data/US_video_data_numbers.csv" gb_path = "./youtube_video_data/GB_video_data_numbers.csv" us = np.loadtxt(us_path, delimiter=",", dtype=np.int) gb = np.loadtxt(gb_path, delimiter=",", dtype=np.int) print(us) print(gb)
-
-
numpy索引和切片
- 取一行:a[1]
- 取连续多行:a[2:4]
- 取不连续多行:a[[2,4]]
- 取一列:a[:,1]
- 取连续多列:a[:,2:4]
- 取不连续多列:a[:,[2,4]]
- 取多个不相邻的点:a[[0,2],[0,1]]
-
numpy中数值的修改
- 取到要修改的行和列后,赋新值:a[:,2:4] = 0(第3列和第4列赋值为0)
-
numpy中的布尔索引 & 三元运算符 & clip(裁剪)
- t[t<10] = 0(把值小于10的,替换为0)
- np.where(t<10,0,10)(小于10的替换为0,其他为10)
- t.clip(10,18)(小于10替换为10,大于18替换为18)
-
numpy中的nan和inf
- nan():not a number不是一个数字
- 什么时候会出现nan?
- 当我们读取本地文件为float的时候,如果有缺失,就会出现nan。
- 当做了一个不合适的计算的时候(比如无穷大减去无穷大)
- inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷。
- 什么时候会出现inf?
- 比如一个数字除以0,(python中会直接报错,numpy中是一个inf或者-inf)
- 注意点:
- 两个nan是不相等的
- np.nan != np.nan是True
- 利用以上特性可以判断数组中nan的个数
- np.count_nonzero(t !=t)
- t[np.isnan(t)]=0
- nan和任何值计算都为nan
- 那么,在一组数据中单纯的把nan替换为0,合适吗?会带来什么样的影响?
- 全部替换为0后,替换之前的平均值如果大于0,替换之后的平均值肯定会变小,所以一般的方式是把缺失的数值替换为均值或中值或者是直接删除有缺失的一行。
4. 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)
- 标准差是一组数据平均值分散程度的一种度量,一个较大的平均差,代表大部分数值和其平均值之间的差异较大。
ndarray缺失值的填充
数组中存在nan值,如何操作把其中的nan填充为每一列的均值
import numpy as np
def fill_ndarray(t1):
for i in range(t1.shape[1]):
# 取到当前这一列
temp_col = t1[:,i]
# 判断当前这一列有没有nan
nan_num = np.count_nonzero(temp_col != temp_col)
if nan_num != 0:
temp_not_nan = temp_col[temp_col == temp_col]
temp_col[np.isnan(temp_col)] = temp_not_nan.mean()
return t1
t1 = np.arange(24).reshape(4,6).astype("float")
t1[1,2:] = np.nan
print(t1)
print("*"*50)
fill_ndarray(t1)
print(t1)
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. nan nan nan nan]
[12. 13. 14. 15. 16. 17.]
[18. 19. 20. 21. 22. 23.]]
**************************************************
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. 12. 13. 14. 15.]
[12. 13. 14. 15. 16. 17.]
[18. 19. 20. 21. 22. 23.]]