机器学习-数据科学库-day3
*
– @[TOC](机器学习-数据科学库-day3)
* numpy学习
*
– 什么是numpy
– numpy创建数组(矩阵)
–
+ numpy中常见的更多数据类型
+ 数据类型的操作
+ 数组的形状
+ 练习
+ 数组和数的计算
+ 数组和数组的计算
+ 广播原则
+ 轴(axis)
+
* 二维数组的轴
* 三维数组的轴
– 数组的切片
–
+ numpy读取数据
+ numpy读取和存储数据
+ numpy中的转置
+ numpy索引和切片
+ numpy中数值的修改
+ numpy中布尔索引
+ numpy中三元运算符
+ numpy中的clip(裁剪)
+
* 练习
+ numpy中的nan和inf
+ numpy中的nan的注意点
+ numpy中常用统计函数
+ ndarry缺失值填充均值
+ 动手练习
– 数组的拼接
–
+ 数组的竖直和水平拼接
+ 数组的行列交换
+ 动手练习
– numpy更多好用的方法
– numpy生成随机数
–
+ 分布的补充
+ numpy的注意点copy和view
– day2 & day3 小结:
numpy学习
什么是numpy
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算
numpy创建数组(矩阵)

; numpy中常见的更多数据类型

数据类型的操作

; 数组的形状


练习
import numpy as np
import random
t1=np.array([1,2,3,4,5])
print(t1)
print(type(t1))
t2=np.array(range(10))
print(t2)
print(type(t2))
t3=np.arange(1,10,2)
print(t3)
print(type(t3))
print(t3.dtype)
print("*"*20)
t4=np.array(range(1,4),dtype="f8")
print(t4)
print(t4.dtype)
t5=np.array([1,1,0,0,1,0,1],dtype=bool)
print(t5)
print(t5.dtype)
t6=t5.astype("int8")
print(t6)
print(t6.dtype)
t7=np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
t8=np.round(t7,2)
print(t8)
print(t8.dtype)
print(np.arange(0,10).reshape(2,5))
运行结果:
C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day02/page58.py
[1 2 3 4 5]
<class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
[1 3 5 7 9]
<class 'numpy.ndarray'>
int32
********************
[1. 2. 3.]
float64
[ True True False False True False True]
bool
[1 1 0 0 1 0 1]
int8
[0.53470254 0.68531382 0.08348858 0.55545799 0.21017324 0.92818368
0.20948581 0.89012421 0.35591318 0.06539644]
float64
[0.53 0.69 0.08 0.56 0.21 0.93 0.21 0.89 0.36 0.07]
float64
[[0 1 2 3 4]
[5 6 7 8 9]]
Process finished with exit code 0
数组和数的计算

; 数组和数组的计算

广播原则

; 轴(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格式的文件,但是操作数据库中的数据也是很容易的实现的
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False

; numpy读取和存储数据
现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量([“views”,”likes”,”dislikes”,”comment_total”])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作
import numpy as np
us_file_path="./youtube_video_data/US_video_data_numbers.csv"
gb_file_path="./youtube_video_data/GB_video_data_numbers.csv"
t1=np.loadtxt(us_file_path,delimiter=",",dtype="int")
t2=np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
print(t1)
print("*"*100)
print(t2)
运行结果:
C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/page74.py
[[4394029 320053 5931 46245]
[7860119 185853 26679 0]
[5845909 576597 39774 170708]
...
[ 142463 4231 148 279]
[2162240 41032 1384 4737]
[ 515000 34727 195 4722]]
****************************************************************************************************
[[4394029 7860119 5845909 ... 142463 2162240 515000]
[ 320053 185853 576597 ... 4231 41032 34727]
[ 5931 26679 39774 ... 148 1384 195]
[ 46245 0 170708 ... 279 4737 4722]]
Process finished with exit code 0
numpy中的转置
转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据

.transpose, .T, .swapaxes(1,0)
这三种方法都可以实现二维数组的转置的效果,大家能够看出来,转置和交换轴的效果一样

import numpy as np
t2=np.arange(24).reshape(4,6)
t3=t2.transpose()
t4=t2.T
t5=t2.swapaxes(1,0)
print(t2)
print("*"*100)
print(t3)
print("*"*100)
print(t4)
print("*"*100)
print(t5)
运行结果:
C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/test-transpose.py
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
****************************************************************************************************
[[ 0 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
****************************************************************************************************
[[ 0 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
****************************************************************************************************
[[ 0 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
Process finished with exit code 0
numpy索引和切片
对于刚刚加载出来的数据,如果只想选择其中的某些列(行)


; numpy中数值的修改

numpy中布尔索引

; numpy中三元运算符

numpy中的clip(裁剪)

; 练习
t1=np.arange(44).reshape(11,4)
print(t1[2])
print("*"*100)
print(t1[2:])
print("*"*100)
print(t1[[2,8,10]])
print("*"*100)
print(t1[:,1])
print(t1[:,2:])
print(t1[:,[0,2]])
a= t1[2,3]
print(a)
print(type(a))
b=t1[2:5,1:4]
print(b)
print(type(b))
c=t1[[0,2,2],[0,1,3]]
print(c)
t8=np.arange(24).reshape(4,6)
print(t8)
print(t8<10)
t8[t8<10]=0
print(t8)
print(np.where(t80,100,300))
运行结果:
C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/page74.py
[ 8 9 10 11]
****************************************************************************************************
[[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]
[32 33 34 35]
[36 37 38 39]
[40 41 42 43]]
****************************************************************************************************
[[ 8 9 10 11]
[32 33 34 35]
[40 41 42 43]]
****************************************************************************************************
[ 1 5 9 13 17 21 25 29 33 37 41]
[[ 2 3]
[ 6 7]
[10 11]
[14 15]
[18 19]
[22 23]
[26 27]
[30 31]
[34 35]
[38 39]
[42 43]]
[[ 0 2]
[ 4 6]
[ 8 10]
[12 14]
[16 18]
[20 22]
[24 26]
[28 30]
[32 34]
[36 38]
[40 42]]
11
<class 'numpy.int32'>
[[ 9 10 11]
[13 14 15]
[17 18 19]]
<class 'numpy.ndarray'>
[ 0 9 11]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ True True True True True True]
[ True True True True False False]
[False False False False False False]
[False False False False False False]]
[[ 0 0 0 0 0 0]
[ 0 0 0 0 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[100 100 100 100 100 100]
[100 100 100 100 300 300]
[300 300 300 300 300 300]
[300 300 300 300 300 300]]
Process finished with exit code 0
numpy中的nan和inf
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的注意点

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)

对于axis的设置,默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
; 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)
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(12).reshape(3, 4).astype("float")
t1[1, 2:] = np.nan
print(t1)
fill_ndarray(t1)
print(t1)
运行结果:
C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/page87.py
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
Process finished with exit code 0
动手练习
英国和美国各自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_comment=t_us[:,-1]
t_us_comment=t_us_comment[t_us_comment5000]
print(t_us_comment.max(),t_us_comment.min())
d=50
bin_nums = (t_us_comment.max()-t_us_comment.min())//d
plt.figure(figsize=(12,8),dpi=80)
plt.hist(t_us_comment,bin_nums)
plt.show()
print(t_us_comment)
print(bin_nums)
运行结果:
4995 0
[ 0 3040 1071 ... 279 4737 4722]
99

希望了解英国的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
import day03
us_file_path = "../day03/youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "../day03/youtube_video_data/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")
zero_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,zero_data))
uk_data=np.hstack((uk_data,ones_data))
final_data=np.vstack((us_data,uk_data))
print(final_data)
运行结果:
C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day04/page94.py
[[4394029 320053 5931 46245 0]
[7860119 185853 26679 0 0]
[5845909 576597 39774 170708 0]
...
[ 109222 4840 35 212 1]
[ 626223 22962 532 1559 1]
[ 99228 1699 23 135 1]]
Process finished with exit code 0
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)
numpy生成随机数

; 分布的补充
1.均匀分布:在相同的大小范围内的出现概率是等可能的

2.正态分布:呈钟型,两头低,中间高,左右对称

import numpy as np
np.random.seed(6)
t=np.random.randint(0,20,(3,4))
print(t)
运行结果:
[[10 9 3 10]
[13 15 10 16]
[ 1 11 13 15]]
numpy的注意点copy和view
- a=b 完全不复制,a和b相互影响
- a =b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
- a =b.copy(),复制,a和b互不影响
day2 & day3 小结:


Original: https://blog.csdn.net/weixin_47049321/article/details/124185278
Author: weixin_47049321
Title: 机器学习-数据科学库-day3
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/600473/
转载文章受原作者版权保护。转载请注明原作者出处!