python数据分析(五)——numpy+matplotlib实例

系列文章:
python数据分析(一)——numpy数组的创建
python数据分析(二)——numpy数组的计算
python数据分析(三)——numpy读取本地数据和索引
python数据分析(四)——numpy中的nan和数据的填充



实战一

  • 英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图
  • 希望了解英国youtube中视频的评论数和喜欢数的关系,应该如何绘制改图

一、评论数量分布直方图

分布直方图

us = np.loadtxt(us_file_path, delimiter = ",", skiprows= 0, dtype = "int")
# uk = np.loadtxt(uk_file_path, delimiter = ",", skiprows= 0, dtype = "int")

# 取评论的数据
us_comments = us[:, -1]

d = 250

# 5000以内的数量分布较多
us_comments = us_comments[us_comments <= 5000]

print(us_comments.max(), us_comments.min())

num = (us_comments.max()-us_comments.min())//d

# 设置图片大小
plt.figure(figsize=(20, 8), dpi=80)

# 绘图
plt.hist(us_comments, num)

# 标题、刻度线
plt.title("美国评论数量分布直方图", fontproperties=font)
plt.xticks(fontproperties=font)
plt.yticks(fontproperties=font)

plt.show()

二、评论数和喜欢数相互关系散点图

散点图

import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties

font = FontProperties(fname="/System/Library/Fonts/Supplemental/Songti.ttc", size=14)

uk_file_path = ".../youtube_video_data/GB_video_data_numbers.csv"

uk = np.loadtxt(uk_file_path, delimiter = ",", skiprows= 0, dtype = "int")

# 选择喜欢数量大于500000的数据
uk = uk[uk[:, 1] <= 500000]
uk_comments = uk[:, -1]
uk_likes = uk[:, 1]

# 设置图片大小
plt.figure(figsize=(20, 8), dpi=80)

# 绘图
plt.scatter(uk_likes, uk_comments)

# 标题、刻度线
plt.title("评论数和喜欢数相关关系", fontproperties=font)
plt.xticks(fontproperties=font)
plt.xlabel("喜欢数量", fontproperties=font)
plt.yticks(fontproperties=font)
plt.ylabel("评论数量", fontproperties=font)

plt.show()

三、数组的拼接

现在把之前案例中两个国家的数据方法一起来研究分析,应该怎么做?

代码实例:

In [1]: t1
0ut[1]:
array([[0, 1, 2, 3, 4, 5],
	   [6, 7, 8, 9, 10, 11]])
	   
In [2]: t2
Out[2]:
array([[12, 13, 14, 15, 16, 17],
	   [18, 19, 20, 21, 22, 23]])
	   
In [3]: np.vstack((t1,t2)) -> 竖直拼接(vertically)
Out[3]:
array([[0, 1, 2, 3, 4, 5],
	   [6, 7, 8, 9, 10, 11],
	   [12, 13, 14, 15, 16, 17],
	   [18, 19, 20, 21, 22, 23]])

In [4]: np.hstack((t1,t2)) -> 水平拼接(horizontally)
Out[167]:
array([[0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17],
	   [6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23]])

水平分割和竖直分割跟水平拼接和竖直拼接是反方向的,水平分割是竖直的一条线切割,竖直分割是水平的一条线切割

四、数组的行列交换

数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?

竖直拼接的时候:每一列代表的意义相同!

如果每一列的意义不同,需要交换某一组的数列,让其和另外一类相同,如何交换某个数组的行或者列?

代码实例:

In [180]: t =. arange(12, 24) .reshape(3, 4)
In [181]: t
0ut[181]:
array([[12, 13, 14, 15],
	   [16, 17, 18, 19],
	   [20, 21, 22, 23]])
	   
In [182]: t[[1,2], :] = t[[2,1], :] #行交换

In [183]: t
Out[183]:
array([[12, 13, 14, 15],
	   [20, 21, 22, 23],
 	   [16, 17, 18, 19]])
 	   
In [184]: t[:, [0,2]] = t[:, [2,0]] #列交换

In [185]: t
Out[185]:
array([(14, 13, 12, 15],
	   [22, 21, 20, 23],
	   [18, 17, 16, 19]])

实战二

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

代码实例:

import numpy as np

us_file_path = ".../youtube_video_data/US_video_data_numbers.csv"
uk_file_path = ".../youtube_video_data/GB_video_data_numbers.csv"

# 加载国家数据
us = np.loadtxt(us_file_path, delimiter=",", skiprows=0, dtype="int")
uk = np.loadtxt(uk_file_path, delimiter=",", skiprows=0, dtype="int")

# 添加国家信息
# 构造全为0的数据,shape[0]表示行,1表示1列
zeros_data = np.zeros((us.shape[0], 1)).astype("int")
# 构造全为1的数据
ones_data = np.ones((uk.shape[0], 1)).astype("int")

us = np.hstack((us, zeros_data))
uk = np.hstack((uk, ones_data))

# 拼接两组数据
final_data = np.vstack((us, uk))
print(final_data)

一、numpy更多好用的方法

  1. 跨行获取最大值的位置:np.argmax(t, axis = 0)
  2. 跨列获取最小值的位置:np.argmin(t, axis = 1)
  3. 创建一个全0数组:np.zeros((3, 4))
  4. 创建一个全1数组:np.ones((3, 4))
  5. 创建一个对角线为1,其他地方全为0的正方形数组/矩阵:np.eye(3)

代码实例:

In [7]: t = np.arange(12).reshape(3, 4)
In [8]: t
Out[8]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
       
In [9]: np.argmax(t, axis = 0)
Out[9]: array([2, 2, 2, 2])

In [10]: np.argmin(t, axis = 1)
Out[10]: array([0, 0, 0])

01 numpy生成随机数

在这里插入图片描述

分布的补充:

  • 均匀分布:在相同的大小范围内出现概率是等可能的
  • 正态分布:呈钟型,两头低,中间高,左右对称

代码实例:

In [3]: np.random.randint(10,20,(4,5)) # 取不到20
Out[3]: 
array([[14, 17, 14, 16, 11],
       [15, 11, 15, 12, 18],
       [14, 16, 13, 18, 13],
       [10, 13, 17, 11, 12]])

代码实例:

In [4]: np.random.seed(10)
In [5]: t = np.random.randint(0,20,(3,4))
In [6]: t
Out[6]: 
array([[ 9,  4, 15,  0],
       [17, 16, 17,  8],
       [ 9,  0, 10,  8]])

In [9]: np.random.seed(11)
In [10]: t = np.random.randint(0,20,(3,4))
In [11]: t
Out[11]: 
array([[16, 17, 13, 12],
       [ 1,  7, 18, 13],
       [16,  0, 13, 12]])

二、numpy注意点copy和view

  • a=b完全不复制,a和b相互影响
  • a=b[:],复制,视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们的数据变化是一致的,也是相互影响的
  • a=b.copy(),复制,a和b互不影响
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【为什么要学习NumpyNumPy是Python语言的一个扩展程序库。支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy是人工智能、数据分析从业者必备的知识和技能,也是学习后续Python扩展库(Matplotlib, SciPy, Pandas, Seaborn, Scikit-image等)的基础。【推荐你学习这门课的理由】(1)图文并茂:课程采用Jupyter Notebook讲解,图文并茂,讲述与Numpy代码对应。其文件将分享给学员,可作为交互式电子书使用。(2)案例丰富: 每个知识点均有Numpy代码示例说明;难点使用图解说明和讲述。另提供Numpy项目实战案例-鸢尾花数据集上的数据分析与计算。(3)内容全面系统:涵盖了Numpy的基础用法和高级用法,包括:ndarray、创建数组、复制数组、数组访问、数组运算、数组操作、迭代数组、maskedarray、结构化数组、通用函数、数学函数、统计函数、排序函数、条件查找、随机数、字节交换、线性代数、数据文件读写等。   玩转是一种境界,显示了对该领域有很大的兴趣,并非常了解和能娴熟使用。希望本课程能帮助大家玩转Numpy!【优惠说明】 课程正在优惠中! 备注:购课后可加入白勇老师课程学习交流QQ群:957519975【相关课程】《玩转Matplotlib数据绘图库》课程链接:https://edu.csdn.net/course/detail/28720 《Python编程的术与道:Python语言入门》课程链接: https://edu.csdn.net/course/detail/27845  《Python编程的术与道:Python语言进阶》课程链接: https://edu.csdn.net/course/detail/28618 【课程体系结构图】  

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值