练习1
在讲解 Matplotlib 的时候,我们使用以下代码绘制分组条形图。其中讲解到,三根柱子的位置需要同时往左或往右移动时,需要使用到列表推导式。现在使用numpy模块来优化以下代码。
import matplotlib.pyplot as plt
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()
以numpy模块进行优化:
import matplotlib.pyplot as plt
import numpy as np # 导入numpy模块
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
# 数据标签函数
def auto_label(x_list,y_list):
for x_i,y_i in zip(x_list,y_list):
plt.text(x_i,y_i+1,f'{y_i}',ha='center',va='bottom')
# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sales = [1000,800,3000]
Q2_sales = [1200,700,2800]
# 柱子的对应索引位置 [0,1,2]
# 设置柱子宽度
width = 0.35
# 蓝黄柱子宽度都为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)))]
po_l = np.arange(len(fruits))-width/2
plt.bar(po_l,Q1_sales,width,label="Q1")
# po_r = [i+width/2 for i in list(range(len(fruits)))]
po_r = np.arange(len(fruits))+width/2
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()
输出结果:
练习2
- 请完成以下基础练习:
– 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
arr1 = np.arange(16).reshape(4,4)
print("创建一个4*4数组arr1:\n"+f"{arr1}")
print("arr1与2做减法,结果为:\n"+f"{arr1-2}")
arr2 = np.arange(16).reshape(4,4)
print("创建一个4*4数组arr2:\n"+f"{arr2}")
arr3 = np.arange(16,32).reshape(4,4)
print("创建一个4*4数组arr3:\n"+f"{arr3}")
print("arr2与arr3进行加法运算,结果为:\n"+f"{arr2+arr3}")
arr4 = np.arange(8).reshape(2,4)
print("创建一个2*4数组arr4:\n"+f"{arr4}")
arr5 = np.arange(4)
print("创建一维数组arr5:\n"+f"{arr5}")
print("arr4与arr5进行加法运算,结果为:\n"+f"{arr4+arr5}")
# np.arange(8).reshape(2,4)与np.arange(4).reshape(1,4)运算吗?
arr6 = np.arange(8).reshape(2,4)
print("创建一个2*4数组arr6:\n"+f"{arr6}")
arr7 = np.arange(4).reshape(1,4)
print("创建一个1*4数组arr7:\n"+f"{arr7}")
print("arr6与arr7进行加法运算,结果为:\n"+f"{arr6+arr7}")
# np.arange(8).reshape(2,4)与np.arange(4).reshape(4,1)运算吗?
arr8 = np.arange(8).reshape(2,4)
print("创建一个2*4数组arr8:\n"+f"{arr8}")
arr9 = np.arange(4).reshape(4,1)
print("创建一个4*1数组arr9:\n"+f"{arr9}")
print("arr8与arr9进行加法运算,结果为:\n"+f"{arr8+arr9}")
输出结果:
创建一个4*4数组arr1:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
arr1与2做减法,结果为:
[[-2 -1 0 1]
[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
创建一个4*4数组arr2:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
创建一个4*4数组arr3:
[[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
arr2与arr3进行加法运算,结果为:
[[16 18 20 22]
[24 26 28 30]
[32 34 36 38]
[40 42 44 46]]
创建一个2*4数组arr4:
[[0 1 2 3]
[4 5 6 7]]
创建一维数组arr5:
[0 1 2 3]
arr4与arr5进行加法运算,结果为:
[[ 0 2 4 6]
[ 4 6 8 10]]
创建一个2*4数组arr6:
[[0 1 2 3]
[4 5 6 7]]
创建一个1*4数组arr7:
[[0 1 2 3]]
arr6与arr7进行加法运算,结果为:
[[ 0 2 4 6]
[ 4 6 8 10]]
创建一个2*4数组arr8:
[[0 1 2 3]
[4 5 6 7]]
创建一个4*1数组arr9:
[[0]
[1]
[2]
[3]]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-63-2b8e73cde585> in <module>
28 arr9 = np.arange(4).reshape(4,1)
29 print("创建一个4*1数组arr9:\n"+f"{arr9}")
---> 30 print("arr8与arr9进行加法运算,结果为:\n"+f"{arr8+arr9}")
ValueError: operands could not be broadcast together with shapes (2,4) (4,1)
结论:
– 广播机制规则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。但当两个数组的维度完全不同时,则无法进行运算。
练习3
- 请完成以下基础练习:
– 构建数组: np.arange(16).reshape(4,4)
– 选择 第3列
– 选择 1-3 列
– 选择 2,4 列
– 选择 4,7 两个点 将值改为 0
– 过滤出 <5 的值
import numpy as np
arr = np.arange(16).reshape(4,4)
print("构建4*4数组arr为:\n" +f"{arr}")
# 选择 第3列
print("arr的第3列为:\n" +f"{arr[:,2]}")
# 选择 1-3 列
print("arr的第1-3列为:\n" +f"{arr[:,:3]}")
# 选择 2,4 列
print("选择arr中的第2,4列为:\n" +f"{arr[:,1::2]}")
# 选择 4,7 两个点 将值改为 0
arr[(arr==4)|(arr==7)] = 0
print("arr的 4,7 两个点,并将值改为 0:\n" +f"{arr}")
# 过滤出 <5 的值
arr1 = arr[arr<5]
print("arr中小于5的值:\n" +f"{arr1}")
输出结果:
构建4*4数组arr为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
arr的第3列为:
[ 2 6 10 14]
arr的第1-3列为:
[[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
[12 13 14]]
选择arr中的第2,4列为:
[[ 1 3]
[ 5 7]
[ 9 11]
[13 15]]
arr的 4,7 两个点,并将值改为 0:
[[ 0 1 2 3]
[ 0 5 6 0]
[ 8 9 10 11]
[12 13 14 15]]
arr中小于5的值:
[0 1 2 3 0 0]
练习4
- 读取scores.csv 数据,并且完成以下练习:
– 筛选出 成绩 大于60 并且 小于80 的数据
– 筛选出 成绩 大于80 并且 小于90 的数据
– 筛选出 成绩 大于90 的数据
import numpy as np
score_data = np.loadtxt("scores.csv",delimiter=",",skiprows=1)
print("读取scores.csv 的数据为:\n" +f"{score_data}")
score_data1 = score_data[(score_data>60)&(score_data<80)]
print("其中成绩大于60并且小于80的数据为:\n" +f"{score_data1}")
score_data2 = score_data[(score_data>80)&(score_data<90)]
print("其中成绩大于80并且小于90的数据为:\n" +f"{score_data2}")
score_data3 = score_data[score_data>90]
print("其中成绩大于90的数据为:\n" +f"{score_data3}")
输出结果:
读取scores.csv 的数据为:
[[52. 83.]
[27. 73.]
[14. 42.]
[82. 34.]
[93. 52.]
[89. 90.]
[62. 49.]
[23. 12.]
[98. 0.]
[88. 26.]
[73. 8.]
[67. 29.]
[87. 26.]
[65. 48.]
[99. 38.]
[23. 80.]
[41. 50.]
[38. 12.]
[30. 79.]
[57. 69.]
[12. 41.]
[81. 6.]
[96. 21.]
[58. 72.]
[43. 73.]
[52. 13.]
[36. 33.]
[48. 93.]
[19. 46.]
[25. 77.]
[10. 29.]
[20. 71.]
[74. 77.]
[37. 44.]
[30. 36.]
[22. 48.]
[22. 67.]
[96. 54.]
[38. 53.]
[95. 13.]]
其中成绩大于60并且小于80的数据为:
[73. 62. 73. 67. 65. 79. 69. 72. 73. 77. 71. 74. 77. 67.]
其中成绩大于80并且小于90的数据为:
[83. 82. 89. 88. 87. 81.]
其中成绩大于90的数据为:
[93. 98. 99. 96. 93. 96. 95.]