机器学习-数据科学库-day3

numpy学习

什么是numpy

一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算

numpy创建数组(矩阵)

在这里插入图片描述

numpy中常见的更多数据类型

在这里插入图片描述

数据类型的操作

在这里插入图片描述

数组的形状

在这里插入图片描述
在这里插入图片描述

练习

#!usr/bin/env python
# -*- coding:utf-8 _*-
import numpy as np
import random

#使用numpy生成数组,得到ndarry的类型
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)

#numpy中数据类型
t4=np.array(range(1,4),dtype="f8")
print(t4)
print(t4.dtype)

#numpy中bool类型
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)
#numpy中的小数
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)
这三种方法都可以实现二维数组的转置的效果,大家能够看出来,转置和交换轴的效果一样

在这里插入图片描述

#!usr/bin/env python
# -*- coding:utf-8 _*-
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]])

#取行和列,例如 取第3行第4列的这个值
a= t1[2,3]
print(a)
print(type(a))

#取多行和多列,例如,取第3行到第5行,第2列到第4列的结果
b=t1[2:5,1:4]
print(b)
print(type(b))

#取多个不相邻的点,
#取出来的结果(0,0),(2,1),(2,3)
c=t1[[0,2,2],[0,1,3]]
print(c)

#numpy中数值的修改:numpy中布尔索引

t8=np.arange(24).reshape(4,6)
print(t8)
print(t8<10)
t8[t8<10]=0
print(t8)

#numpy中三元运算符
print(np.where(t8<=0,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缺失值填充均值

#!usr/bin/env python
# -*- coding:utf-8 _*-
import numpy as np
#定义函数,将数组中的nan值改为该列的平均值
def fill_ndarray(t1):

    for i in range(t1.shape[1]):    #遍历每一列
        temp_col=t1[:,i]    #当前的一列
        nan_num=np.count_nonzero(temp_col!=temp_col)    #计算当前列包含几个nan值
        if nan_num!=0:  #不为0,说明当前列包含nan
            #当前一列不为nan的array
            temp_not_nan_col=temp_col[temp_col==temp_col]
            # 把当前一列不为nan的array均值,赋给当前列的nan。
            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绘制出各自的评论数量的直方图

#!usr/bin/env python
# -*- coding:utf-8 _*-
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]

#选择比5000小的数据
t_us_comment=t_us_comment[t_us_comment<=5000]

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中视频的评论数和喜欢数的关系,应该如何绘制改图

#!usr/bin/env python
# -*- coding:utf-8 _*-
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")
#取喜欢数小于50万的数据
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()

运行结果:

在这里插入图片描述

数组的拼接

数组的竖直和水平拼接

在这里插入图片描述

数组的行列交换

在这里插入图片描述

动手练习

现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办

#!usr/bin/env python
# -*- coding:utf-8 _*-
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_file_path = r"C:\Users\Lenovo\PycharmProjects\Code\day03\youtube_video_data/US_video_data_numbers.csv"
#uk_file_path =r"C:\Users\Lenovo\PycharmProjects\Code\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")
#print(us_data)
#print(uk_data)

#添加国家信息
#构造全为0的数据
zero_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,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

  1. a=b 完全不复制,a和b相互影响
  2. a =b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
  3. a =b.copy(),复制,a和b互不影响

day2 & day3 小结:

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_47049321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值