文章目录
(一) Numpy
什么是Numpy?
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算
(二) Numpy创建数组(矩阵)
2.1 创建数组
import numpy as np
# 下面a,b,c内容相同
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)
print(a)
print('**********')
print(b)
print('**********')
print(c)
Out:
[1 2 3 4 5]
**********
[1 2 3 4 5]
**********
[1 2 3 4 5]
2.2 np.arange()的用法
np.arange()函数分为三种情况:一个参数
,两个参数
,三个参数
三种情况
- (1)
一个参数
时,参数值为终点,起点取默认值0,步长取默认值1。 - (2)
两个参数
时,第一个参数为起点,第二个参数为终点,步长取默认值1。 - (3)
三个参数
时,第一个参数为起点,第二个参数为终点,第三个参数为步长。其中步长支持小数
2.3 数组的类名
# 数组的类名
print("数组的类名")
a = np.array([1,2,3,4,5])
print(type(a))
# 数据的类型
print('数据的类型')
print(a.dtype)
Out:
数组的类名
<class 'numpy.ndarray'>
数据的类型
int32
2.3 numpy中常见的更多数据类型
# 指定创建的数组的数据类型
print('\n指定创建的数组的数据类型')
a = np.array([1,0,1,0],dtype=np.bool) # 或者写成dtype='?'
print(a)
# 修改数组的数据类型
print('\n修改数组的数据类型')
print(a.astype("i1")) # 或者使用a.astype(np.int8)
# 修改浮点型的小数位数
print('\n修改浮点型的小数位数')
b = [0.0485436,0.26320639,0.6964613,0.71811003,0.3576838,
0.58919477,0.84757749,0.52428633,0.486302,0.48908838]
print(np.round(b,2))
Out:
指定创建的数组的数据类型
[ True False True False]
修改数组的数据类型
[1 0 1 0]
修改浮点型的小数位数
[0.05 0.26 0.7 0.72 0.36 0.59 0.85 0.52 0.49 0.49]
# 查看数组的形状
print('\n查看数组的形状')
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
print(a.shape)
# 修改数组的形状
print('\n修改数组的形状')
print(a.reshape(3,4)) # 这不是永久改变数组类型
print(a.shape)
# 把数组转化为一维数组
print('\n这不是一维数组')
print(a.reshape(1,12))
print('\n这是一维数组')
print(a.flatten())
# 加法和乘法
print('\n加法和惩罚')
print(a+1)
print('***********************')
print(a*3)
Out:
查看数组的形状
(2, 6)
修改数组的形状
[[3 4 5 6]
[7 8 4 5]
[6 7 8 9]]
(2, 6)
这不是一维数组
[[3 4 5 6 7 8 4 5 6 7 8 9]]
这是一维数组
[3 4 5 6 7 8 4 5 6 7 8 9]
加法和惩罚
[[ 4 5 6 7 8 9]
[ 5 6 7 8 9 10]]
***********************
[[ 9 12 15 18 21 24]
[12 15 18 21 24 27]]
2.4 广播原则
怎么理解呢?
可以把维度指的是shape所对应的数字个数。
那么问题来了:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?
答:不能
,因为(3,3,3)的数组不含有(3,2)的数组的形式。
shape为(3,3,2)的数组能够和(3,2) 或(3,3)的数组进行计算么?
答:能
,因为(3,3,2)的数组包含(3,2) 或(3,3)的数组的形式。
2.5 轴
在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴
二维数组的轴
三维数组的轴
(三) numpy读取数据
3.1 读取数据
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:
- 换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录。
- 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的。
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
实例:
现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量([“views”,“likes”,“dislikes”,“comment_total”])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作
数据来源:https://www.kaggle.com/datasnaek/youtube/data
百度网盘分享链接:https://pan.baidu.com/s/1ZCHPES9krGN9yxZqml97ow
提取码:ne9r
实例
import numpy as np
from matplotlib import pyplot as plt
us_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/us_videos_data_numbers.csv"
uk_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/gb_videos_data_numbers.csv"
#t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t_uk = np.loadtxt(uk_file_path,delimiter=",",dtype="int")
t_uk=t_uk[t_uk[:,1]<=100000]
t_uk_comment = t_uk[:,-1]
t_uk_like = t_uk[:,1]
#t_uk_like = t_uk_like[t_uk_like<=10000]会出现size报错,必须写t_uk=t_uk[t_uk[:,1]<=100000]
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(t_uk_like,t_uk_comment)
plt.show()
3.2 numpy中的转置
# 转置
t = [[0, 1, 2 ,3, 4, 5],
[6, 7, 8, 9, 10,11],
[12,13,14,15,16,17]]
print('\n源仔')
print(t)
print("源仔")
print(np.transpose(t))
Out:
源仔
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17]]
源仔
[[ 0 6 12]
[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]]
3.3 numpy索引和切片
取行一般冒号在后面或者后面冒号省略;取列一般冒号在前或者前面冒号省略
问题:如果我们想把t中小于10的数字替换为0,把大于10的替换为10,应该怎么做??
**numpy中的clip(裁剪)**
- clip(10,18): 小于10的替换为10,大于18的替换为了18
- 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
那么如何指定一个nan或者inf呢?注意他们的type类型
numpy中的nan的注意点
3.3 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)
标准差:是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,约不稳定
实战
题目:英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图;希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图
import numpy as np
from matplotlib import pyplot as plt
us_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/us_videos_data_numbers.csv"
uk_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/gb_videos_data_numbers.csv"
#t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t_us = np.loadtxt(uk_file_path,delimiter=",",dtype="int")
#取评论的数据
t_us_comment=t_us[:,-1] #表示取最后一列
# 选择比10000小的数据
t_us_comment = t_us_comment[t_us_comment<=10000]
print(t_us_comment.max(),t_us_comment.min())
d = 100
bin_nums = (t_us_comment.max()-t_us_comment.min())//d
# 绘图
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comment,bin_nums)
plt.show()
(四)数组的拼接
4.1 矩阵的转换和拼接
-
np.vstack((t1,t2)) # 竖直拼接t1和t2矩阵vertically
-
np.hstack((t1,t2)) # 水平拼接t1和t2矩阵horizontally
-
行列转换
如下实例:
import numpy as np
t1 = [[0,1,2,3,4,5,],
[6,7,8,9,10,11]]
t2 = [[1,1,12,3,7,5,],
[4,7,14,9,0,11]]
print(t1)
print("**************")
print(t2)
T1 = np.vstack((t1,t2)) # 竖直拼接vertically
print('**************')
print(T1)
T2 = np.hstack((t1,t2)) # 水平拼接horizontally
print("**************")
print(T2)
T1 = np.vstack((t1,t2)) # 竖直拼接vertically
print('**************')
print(T1)
T2 = np.hstack((t1,t2)) # 水平拼接horizontally
print("**************")
print(T2)
t3 = np.arange(12,24).reshape(3,4)
print('\n行列交换')
print(t3)
t3[[1,2],:] = t3[[2,1],:]
T3_1 = t3
print('行交换')
print(T3_1)
t3[:,[0,2]] = t3[:,[2,0]]
T3_2 = t3
print('列交换')
print(T3_2)
Out:
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
**************
[[1, 1, 12, 3, 7, 5], [4, 7, 14, 9, 0, 11]]
**************
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[ 1 1 12 3 7 5]
[ 4 7 14 9 0 11]]
**************
[[ 0 1 2 3 4 5 1 1 12 3 7 5]
[ 6 7 8 9 10 11 4 7 14 9 0 11]]
行列交换
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
行交换
[[12 13 14 15]
[20 21 22 23]
[16 17 18 19]]
列交换
[[14 13 12 15]
[22 21 20 23]
[18 17 16 19]]
Process finished with exit code 0
4.2 numpy更多好用的方法
- 获取最大值最小值的位置
- np.argmax(t,axis=0)
- np.argmin(t,axis=1)
- 创建一个全0的数组: np.zeros((3,4))
- 创建一个全1的数组:np.ones((3,4))
- 创建一个对角线为1的正方形数组(方阵):np.eye(3)
4.3 numpy生成随机数
np.random.····
t = np.random.randint(0,20,(3,4))
print('\n源仔')
print(t)
t_5 = np.random.seed(10)
print('\n源仔')
print(t_5)
Out:
源仔
[[18 17 17 17]
[16 17 13 10]
[ 7 2 16 15]]
第二次运行结果:
源仔
[[ 6 1 1 18]
[17 15 18 6]
[12 10 6 16]]
4.4 numpy的注意点copy和view
- a=b 完全不复制,a和b相互影响
- a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
- a = b.copy(),复制,a和b互不影响