Numpy的使用

什么是numpy

NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。

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))
##arange是numpy特有的,直接生成numpy数组
t3 = np.arange(4,10,2)
print(t3)
print(type(t3))
print(t3.dtype)
print("*"*100)
#numpy中的数据类型
t4 = np.array(range(1,4),dtype="i1")
print(t4)
print(t4.dtype)
##numpy中的bool类型
t5 = np.array([1,1,0,1,0,0],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)

运行结果:

[1 2 3]
<class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
[4 6 8]
<class 'numpy.ndarray'>
int32
****************************************************************************************************
[1 2 3]
int8
[ True  True False  True False False]
bool
[1 1 0 1 0 0]
int8
[0.96256486 0.44036464 0.4847946  0.0972162  0.44209702 0.21407875
 0.48392533 0.77664633 0.56998715 0.8784573 ]
float64
[0.96 0.44 0.48 0.1  0.44 0.21 0.48 0.78 0.57 0.88]

numpy的数据类型:
在这里插入图片描述

矩阵的形状

[注]以下代码是在ipython命令行里敲的
在这里插入图片描述
reshape方法是有返回值的,并不会改变原矩阵!!
在这里插入图片描述
reshape里如果有两个数,则是二维,并不是一维数组!!
要想变为一维,就用flatten使其扁平化!!
在这里插入图片描述
【注】如果矩阵除以0,那么不会报错,但是有警告,0除以0的结果为nan,非零数除以0结果为inf
在这里插入图片描述
[结论]两个维度完全一样的矩阵做加减,对应位置的元素做加减。若某一维度相同,也可以做加减,如3x4的矩阵和1x4的矩阵相加,结果为3x4的矩阵每一行都加上对应位置的1x4中的元素!如下图!
在这里插入图片描述
在这里插入图片描述
此处学过线性代数的同学一定会对矩阵的乘法提出质疑,因为乘法难道不是必须如3x4与4x3这种矩阵才能相乘吗,为什么上图2x6与2x1也能乘??这还真不一样!!此处的乘跟加减道理一样,对应相乘!线代的那个乘法稍后会用一个方法来实现!我们来看看矩阵的±/实现的原理是什么?
在这里插入图片描述
这样就解释了(2,6)与(2,1)的矩阵为什么可以±
/了,因为他们在某一维度上一致!!!(3,3,2)可与(3,2)兼容,因为我们可以将(3,3,2)看成一个长方体,我横着把它切成三块,然后我再把每一块按(3,2)去切!很明显(3,3,2)的某一个切面与(3,2)维度一致!!(自己画图)
接下来,来看线性代数里面的那个矩阵相乘!
在这里插入图片描述
没错,就使用dot方法!这里举的例子是3x4和4x3相乘,如果把这两个矩阵还用“*”来乘,则会出现以下异常!!
在这里插入图片描述
broadcast就是广播的意思,很明显广播出错,形状不兼容!!

轴的概念

在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴

有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值

那么问题来了:
在前面的知识,轴在哪里?
回顾np.arange(0,10).reshape((2,5)),reshpe中2表示0轴长度(包含数据的条数)为2,1轴长度为5,2X5一共10个数据

二维数组的轴:
在这里插入图片描述
三维数组的轴
在这里插入图片描述

numpy读取数据

CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的

读取数据的方法:
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

在这里插入图片描述

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,delimiter=",",dtype="int",unpack=True)
#当unpack为True时就是转置
t2 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
# print(t1)
print(t2)
print("*"*100)
#取行
# print(t2[2])
#取连续的多行
# print(t2[2:])
#取不连续的多行
# print(t2[[2,8,10]])
# print(t2[1,:])
# print(t2[2:,:])
# print(t2[[2,10,3],:])
#取列
# print(t2[:,0])
#取连续的多列
# print(t2[:,2:])
#取不连续的多列(隐含条件是每一行都要,也就是逗号前面加冒号,代表第一行到最后一行)
# print(t2[:,[0,2]])
#取行和列,取第3行,第四列的值
# a = t2[2,3]
# print(a)
# print(type(a))
#取多行和多列,取第3行到第五行,第2列到第4列的结果
#去的是行和列交叉点的位置
b = t2[2:5,1:4]
# print(b)
#取多个不相邻的点
#选出来的结果是(0,0) (2,1) (2,3)
c = t2[[0,2,2],[0,1,3]]
print(c)

【注】被解析的文件可找我要!!

转置:

在这里插入图片描述

numpy索引和切片

在这里插入图片描述
[注]逗号前面是控制行切片,逗号后面是控制列切片!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Nan是float类型!!!不能讲nan直接赋给矩阵中的某个元素,必须将矩阵的元素转为float才能赋值。这里有一个方法:
t.astype(float)意思是将t矩阵的里面的数据都转换为float(能转才转,不能转报错!)

数据的拼接

在这里插入图片描述
在这里插入图片描述
现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办?
(这里假设在在最后加上一列用来表示国家信息,0美国,1英国)

import numpy as np
us_data = "US_video_data_numbers.csv"
uk_data = "GB_video_data_numbers.csv"
#加载国家数据
us_data = np.loadtxt(us_data,delimiter=",",dtype=int)
uk_data = np.loadtxt(uk_data,delimiter=",",dtype=int)
# 添加国家信息
#构造全为0的数据
##shape[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)
t1=np.arange(12).reshape((3,4))
print(t1.shape[0])

在这里插入图片描述
Numpy生成随机数
在这里插入图片描述

import numpy as np
##随机数种子,使每一次随机的都一样
np.random.seed(10)
t = np.random.randint(0,20,(3,4))
print(t)

numpy的注意点copy和view
在这里插入图片描述
[注]前两个只要改变其中一个,双方都会受影响,copy方法是重新开辟一块新空间!所以不会影响!
在这里插入图片描述
numpy中的nan的注意点

在这里插入图片描述
常用统计函数
在这里插入图片描述
那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
那么问题来了:
如何计算一组数据的中值或者是均值
如何删除有缺失数据的那一行(列)[在pandas中介绍]
在这里插入图片描述
【注】上述的对行列操作的步骤均会对原有矩阵影响!!

与matplotlib的结合使用

英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图

us_file_path = "US_video_data_numbers.csv"
uk_file_path = "GB_video_data_numbers.csv"
# t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t_us = np.loadtxt(us_file_path,delimiter=",",dtype="int")
#取评论的数据
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 = 50
bin_nums = (t_us_comments.max()-t_us_comments.min())//d
#绘图
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comments,bin_nums)
plt.show()

在这里插入图片描述
希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图?

us_file_path = "US_video_data_numbers.csv"
uk_file_path = "GB_video_data_numbers.csv"
# t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
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()

在这里插入图片描述
【注】以上的英国和美国的Youtube的数据可找我要!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值