利用Python进行简单的文件操作+Numpy库的练习
练习题
文件操作+Numpy的简单使用(1)

Numpy的简单使用(2)

Numpy优化Matplotlib画图过程


Numpy在数组上的简单应用


文件操作+Numpy的简单使用(1)
练习一代码
方法一
# Question1 读取餐饮.csv文件的数据
# 方法一 利用csv库
import csv
# 文件和代码文件放置在同一个文件夹里面
with open("餐饮.csv", "r", newline="") as restaurant_csv:
data_reader = csv.reader(restaurant_csv)
#利用for循环讲csv里面的内容输出到终端中
for i in data_reader:
print(i)
# 此方法会将全部数据输入到终端 所以不提供效果图
方法二
# 方法二 利用pandas库
import pandas as pd
print(pd.read_csv("餐饮.csv", encoding='gbk'))
# pandas会比csv库简单快捷很多
# 但此问题不太适合利用numpy库读取文件,有太多中文字体涉及 不利于操作
练习一效果图

练习二
方法一
# Question 2 读取Stock.xlsx文件数据
# 方法一 利用openpyxl库
from openpyxl import load_workbook
# 打开工作簿
# 文件和代码文件放置在同一个文件夹里面
workbook = load_workbook("Stock.xlsx")
# 读取第一个工作表
worksheet = workbook.active
# 利用for循环输出内容
for row in worksheet.rows:
for cell in row:
print(cell.value)
# 此方法会将所有数据输出到终端 所以不提供效果图
方法二
# 方法二 利用pandas库
import pandas as pd
print(pd.read_excel("Stock.xlsx"))
# 此题没有用Numpy是因为操作比较没有pandas快捷
练习二效果图

练习三
代码
# Question 3
# 1. 输出0-9的数组arr
import numpy as np
arr = np.array(range(10))
print(arr)
# 2. 查看arr的数据类型
print(arr.dtype)
# 3. 创建0-5的数组arr1,并指定其数据类型为"bool"
arr1 = np.array(range(6), dtype=bool)
print(arr1)
print(arr1.dtype)
# 4. 改变arr1的数据类型为"float64"
arr1.astype("float64")
print(arr1.dtype) # 但是np.astype()这个方法不会改变原本的数据类型
练习三效果图

Numpy的简单使用(2)
代码
# Questions:
#创建 2*2 的数组arr1 元素自定义
import numpy as np
arr1 = np.array([[6, 8], [7, 9]])
print("arr1数组:")
print(arr1)
# 创建 2*2*3 的数组arr2 元素自定义
arr2 = np.array([[[7, 7, 7], [7, 7, 7]], [[7, 7, 7], [7, 7, 7]]])
print("arr2数组:")
print(arr2)
# 查看arr2的维度以及形状
print("arr2的维度和形状:")
print(arr2.ndim)
print(arr2.shape)
# 将arr2转为1维
print("arr2的原有形状:")
print(arr2) # 数组的原有形状
print("arr2转为一维:")
print(arr2.flatten()) # 此方法不会改变原有的数组形状
# 将arr1进行转置
print("arr1原有形状:")
print(arr1) # 数组的原有形状
print("arr1转置 方法一:")
print(arr1.transpose()) # 方法不会改变原有的数组形状
print("arr1转置 方法二:")
print(arr1.T) # 方法不会改变原有的数组形状
# 生成 4*4 全为1的数组 arr3
arr3 = np.ones((4, 4))
print("arr3数组:")
print(arr3)
# 生成 单位矩阵
arr4 = np.eye(2)
print("利用eye()函数生成规格为2*2的单位矩阵arr4")
print(arr4)
效果图

Numpy优化Matplotlib画图过程
优化代码(练习一)
# Question 1
import numpy as np
import matplotlib.pyplot as plt
# 步骤一(替换sans-serif字体)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 步骤二(解决坐标轴负数的负号显示问题)
plt.rcParams['axes.unicode_minus'] = False
# 定义一个函数来放置数据
def auto_text(positions, sales):
coordinates = zip(positions, sales)
for (x, y) in coordinates:
plt.text(x, y, y, ha='left', va='bottom')
# 构建 x 和 height
fruits = ["苹果", "梨子", "车厘子"]
Q1_sales = [1000, 800, 3000]
Q2_sales = [1200, 700, 2800]
# 设置柱子宽度
width = 0.4
# 利用numpy的数组计算 来表示柱子的x坐标
# range(3)是因为原始的索引位置为[0, 1, 2]
rect1_x = np.array(range(3)) - width/2
rect2_x = np.array(range(3)) + width/2
plt.bar(rect1_x, Q1_sales, width, label='Q1')
plt.bar(rect2_x, Q2_sales, width, label='Q2')
# 设置图例
plt.legend()
# 数据标签
auto_text(rect1_x, Q1_sales)
auto_text(rect2_x, Q2_sales)
# x轴的文字
plt.xticks(list(range(len(fruits))), fruits)
# 标题
plt.title("苹果、梨子、车厘子的季度销量", fontweight='bold', color='brown')
# 画图
plt.show()
效果图

Numpy在数组上的简单应用
练习二
练习二代码
# Question 2
import numpy as np
# • np.arange(16).reshape(4,4)与2做减法
result1 = np.arange(16).reshape(4, 4) - 2
print(result1)
print()
# • np.arange(16).reshape(4,4)与np.arange(16,32).reshape(4,4)做加法运算
arr1 = np.arange(16).reshape(4, 4)
arr2 = np.arange(16, 32).reshape(4, 4)
result2 = arr1 + arr2
print(result2)
print()
# • np.arange(8).reshape(2,4)与np.arange(4)运算吗?
arr3 = np.arange(8).reshape(2, 4)
arr4 = np.arange(4)
result3 = arr3 - arr4
print(result3)
print("可以进行运算,因为arr3和arr4的列数相同而且arr4只有一行,广播机制在这里可以使用。")
print()
# • np.arange(8).reshape(2,4)与np.arange(4).reshape(1,4)运算吗?
arr5 = np.arange(8).reshape(2, 4)
arr6 = np.arange(4).reshape(1, 4)
result4 = arr5 - arr6
print(result4)
print("可以进行运算,因为arr5和arr6的列数相同而且arr6只有一行,广播机制在这里可以使用。")
print()
# • np.arange(8).reshape(2,4)与np.arange(4).reshape(4,1)运算吗?
arr7 = np.arange(8).reshape(2, 4)
arr8 = np.arange(4).reshape(4, 1)
print("arr7:")
print(arr7)
print("arr8:")
print(arr8)
print("不可以进行运算,会报错,因为arr7和arr8的维度完全不一致,无法使用广播机制。")
练习二效果图

练习三
练习三代码
# Question 3
import numpy as np
# 构建数组: np.arange(16).reshape(4,4)
array = np.arange(16).reshape(4, 4)
print("数组array:")
print(array)
print()
# 选择 第3列
result1 = array[:, 2:3]
print("第3列:")
print(result1)
print()
# 选择 1-3 列
result2 = array[:, :3]
print("1-3列:")
print(result2)
print()
# 选择 2,4 列
result3 = array[:, [1, 3]]
print("第2,4列:")
print(result3)
print()
# 选择 4,7 两个点 将值改为 0
print(array[[1, 1], [0, 3]])
array[[1, 1], [0, 3]] = 0
print(array)
print()
# 过滤出 <5 的值
print("利用布尔索引 符合条件的值会显示为True")
array2 = array[array < 5]
print(array < 5)
print("array中小于5的值有:")
print(array2)
练习三效果图

小结
- 利用Python进行文件读写操作时,最好使用pandas库(方便快捷)。
- 以后用Matplotlib库画图时可以利用Numpy处理数据,简介代码并且加快代码运算速度。
- 处理多维数组时,一定要注意每个元素的位置,以及行、列、块等轴的位置。
- 要注意索引和切片的区别。
版权声明:本文为MaRin0709原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。