数据分析Numpy数组运算练习 -AI小白进阶之路

7 篇文章 0 订阅
4 篇文章 0 订阅

练习一

在讲解 Matplotlib 的时候,我们使用以下代码绘制分组条形图。其中讲解到,三根柱子的位置需要同时往左或往右移动时,需要使用到列表推导式。实际上,还有其他方法,请使用numpy的所学来优化我们该部分代码。
原代码如下:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sales = [1000,800,3000]
Q2_sales = [1200,700,2800]

# 柱子的对应索引位置 [0,1,2]
# 设置柱子宽度
width = 0.35
# rects1 = plt.bar(list(range(len(fruits))),Q1_sales,width)
# rects2 = plt.bar(list(range(len(fruits))),Q2_sales,width)

# 蓝黄柱子宽度都为0.35 怎么使蓝色显示左边  黄色显示右边
# 位置左移width/2  位置-width/2    [0-width/2,1-width/2,2-width/2]
po_l = [i-width/2 for i in list(range(len(fruits)))]
plt.bar(po_l,Q1_sales,width,label="Q1")

po_r = [i+width/2 for i in list(range(len(fruits)))]
plt.bar(po_r,Q2_sales,width,label="Q2")


# 设置图例 
plt.legend()

# 使用函数,数据标签
#auto_label(po_l,Q1_sales)
#auto_label(po_r,Q2_sales)

plt.xticks(list(range(len(fruits))),fruits)

plt.show()
原代码运行结果的绘图,如下所示:

在这里插入图片描述

 优化为:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sales = [1000,800,3000]
Q2_sales = [1200,700,2800]

# 柱子的对应索引位置 [0,1,2]
# 设置柱子宽度
width = 0.35
# rects1 = plt.bar(list(range(len(fruits))),Q1_sales,width)
# rects2 = plt.bar(list(range(len(fruits))),Q2_sales,width)

# 蓝黄柱子宽度都为0.35 怎么使蓝色显示左边  黄色显示右边
# 位置左移width/2  位置-width/2    [0-width/2,1-width/2,2-width/2]
# po_l = [i-width/2 for i in list(range(len(fruits)))]
# plt.bar(po_l,Q1_sales,width,label="Q1")

# po_r = [i+width/2 for i in list(range(len(fruits)))]
# plt.bar(po_r,Q2_sales,width,label="Q2")

# 优化代码:代码中尽量少的使用for循环,引入数组运算广播机制,将x轴值用数组arr表示
arr = np.arange(3)       

po_ll = arr-0.175
plt.bar(po_ll,Q1_sales,width,label="Q1")

po_rr = arr+0.175 
plt.bar(po_rr,Q2_sales,width,label="Q2")

# 设置图例 
plt.legend()

# 使用函数,数据标签
# auto_label(po_l,Q1_sales)
# auto_label(po_r,Q2_sales)

plt.xticks(list(range(len(fruits))),fruits)

plt.show()
经过优化后的代码,运行结果如下所示:

在这里插入图片描述

练习二

请完成以下基础练习:
• np.arange(16).reshape(4,4)与2做减法

• np.arange(16).reshape(4,4)与np.arange(16,32).reshape(4,4)做加法运算

• np.arange(8).reshape(2,4)与np.arange(4)运算吗?

• np.arange(8).reshape(2,4)与np.arange(4).reshape(1,4)运算吗?

• np.arange(8).reshape(2,4)与np.arange(4).reshape(4,1)运算吗?
import numpy as np

# np.arange(16).reshape(4,4)与2做减法
arr1 = np.arange(16).reshape(4,4)
arr1-2

在这里插入图片描述

# np.arange(16).reshape(4,4)与np.arange(16,32).reshape(4,4)做加法运算
arr2 = np.arange(16).reshape(4,4)
arr3 = np.arange(16,32).reshape(4,4)
arr2+arr3

在这里插入图片描述

#  np.arange(8).reshape(2,4)与np.arange(4)运算吗?  
#	回答:可以。
arr4 = np.arange(8).reshape(2,4)
arr5 = np.arange(4)
arr4+arr5

在这里插入图片描述

# np.arange(8).reshape(2,4)与np.arange(4).reshape(1,4)运算吗? 回答:可以。
arr6 = np.arange(4).reshape(1,4)
arr4+arr6

在这里插入图片描述

#  np.arange(8).reshape(2,4)与np.arange(4).reshape(4,1)运算吗?  

# 回答:不可以,因为两个数组在行、列两个维度上都没有一个是一致的,不能广播。
arr7 = np.arange(4).reshape(4,1)
arr4+arr7
运行结果报错如下:

在这里插入图片描述

练习三

请完成以下基础练习:
• 构建数组: np.arange(16).reshape(4,4)
• 选择 第3列
• 选择 1-3 列
• 选择 2,4 列
• 选择 4,7 两个点 将值改为 0
• 过滤出 <5 的值
import numpy as np

# 构建数组: np.arange(16).reshape(4,4)
a = np.arange(16).reshape(4,4)
a

在这里插入图片描述

# 选择 第3列
a[:,2]

在这里插入图片描述

# 选择 1-3 列
a[:,:3]

在这里插入图片描述

# 选择 2,4 列
a[:,1::2] 

在这里插入图片描述

# 选择 4,7 两个点 将值改为 0
# 方法一,神奇索引法
a[1,(0,3)] = 0
a

# 方法二,分隔法
a[1,::3] = 0
a

在这里插入图片描述

# 过滤出 <5 的值
a[a<5]

在这里插入图片描述

# 自己给自己加题,哈哈。
# 过滤出a中 大于2,且 小于10的值
a[(2<a) & (a<10)]    

# 在numpy与pandas中是基于c语言封装的,所以这里的每个条件需要单独加上括号。 需要注意下!
# 另外数组的逻辑运算符中,and是用符号& (shirt+键盘上数字8)表示,or是用符号|(shirt+enter上面的顿号键)表示。

在这里插入图片描述

练习四

通过以下代码读取📎scores.csv 数据,并且完成以下练习:
import numpy as np
score_data = np.loadtxt("scores.csv",delimiter=",",skiprows=1)
score_data
• 筛选出 成绩 大于60 并且 小于80 的数据
• 筛选出 成绩 大于80 并且 小于90 的数据
• 筛选出 成绩 大于90 的数据
import numpy as np

score_data = np.loadtxt("scores.csv",delimiter=",",skiprows=1,encoding='gbk')
# scores.csv,表示读取的文件,注意:需要提前把该文件放到跟本代码.ipynb格式同一个文件夹下,才能正常读取到文件。
# skiprows=1,表示跳过第一行,因为第一行是中文字符串,不能转换成浮点,如果去掉会报错,可以试试。
# encoding='gbk',表示编码方式为国标码gbk,因为读取到文件scores.csv是gbk的,默认的编码utf无法读取,需要单独注明。
score_data

在这里插入图片描述

print(score_data.ndim)   # 数据维度  二维
print(score_data.shape)  # 数据形状  40行2列
print(score_data.dtype)  # 数据类型  float64位

在这里插入图片描述

# • 筛选出 成绩 大于60 并且 小于80 的数据
score_data[(60<score_data)&(score_data<80)]

在这里插入图片描述

# • 筛选出 成绩 大于80 并且 小于90 的数据
score_data[(80<score_data)&(score_data<90)]

在这里插入图片描述

# • 筛选出 成绩 大于90 的数据
score_data[score_data>90]

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值