本文共 4472 字,大约阅读时间需要 14 分钟。
NumPy --> 保存数据和数据运算 --> SciPy
Pandas -->Panel Data Set --> 提供了核心的数据结构来展示和处理数据–>展示和处理数据(整合了NumPy 和 Matplotlib) Matplotlib -->数据可视化(把数据变成漂亮的图表)import randomnames = ['白起', '庄周', '狄仁杰', '吕布', '达摩']courses = ['语文', '数学', '英语']n, m = len(names), len(courses)scores = [[random.randint(60, 100) for _ in range(m)] for _ in range(n)]#[[93, 98, 85], [88, 76, 70], [69, 85, 61], [91, 75, 64], [70, 60, 66]]for i, score in enumerate(scores): avg_score = sum(score) / m print(f'{ names[i]}的平均分:{ avg_score:.1f}')"""白起的平均分:92.0庄周的平均分:78.0狄仁杰的平均分:71.7吕布的平均分:76.7达摩的平均分:65.3"""for i, course in enumerate(courses): temp = [scores[j][i] for j in range(n)] max_score, min_score = max(temp), min(temp) print(f'{ course}的最高分: { max_score}') print(f'{ course}的最低分: { min_score}')"""语文的最高分: 96语文的最低分: 65数学的最高分: 98数学的最低分: 70英语的最高分: 78英语的最低分: 61"""
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
NumPy
NumPy的核心是ndarray,它可以用来表示多维数组。ndarray在保存和运算能力上,远远强过Python中的list类型。
# 将嵌套列表处理成NumPy的二维数组scores = np.array(scores)print(scores)"""array([[93, 98, 85], [88, 76, 70], [69, 85, 61], [91, 75, 64], [70, 60, 66]])"""type(scores) # numpy.ndarraynp.round(scores.mean(axis=1), 1) #[92. , 78. , 71.7, 76.7, 65.3]scores.max(axis=0) #[93, 98, 85]scores.min(axis=0) #[69, 60, 61]scores.std(axis=0) # [10.49571341, 12.51239386, 8.42377588]
Pandas
核心数据类型DataFrame,跟我们平时用的二维表一模一样。score_df = pd.DataFrame(data=scores, columns=courses, index=names)score_df
avg_score = np.round(score_df.mean(axis=1), 1)avg_score
score_df['平均分'] = avg_scorescore_df
max_score = score_df.max(axis=0)min_score = score_df.min(axis=0)score_df.loc['最高分'] = max_scorescore_df.loc['最低分'] = min_scorescore_df
score_df.to_excel('学生成绩统计表.xlsx')# 配置支持中文的字体plt.rcParams['font.sans-serif'] = ['FangSong']# 魔法指令%config InlineBackend.figure_format = 'svg'score_df.loc['白起': '达摩'].plot(kind='bar', y=['语文', '数学', '英语'])plt.xticks(rotation=0)plt.savefig('学生成绩柱状图.svg')plt.show()
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt%matplotlib inline #内嵌图%config InlineBackend.figure_format = 'svg' # 出的图为矢量图
# 用array函数通过list创建创建一维数组array1 = np.array([1, 10, 100, 1000])# 用arange函数指定起止范围创建一维数组array2 = np.arange(1, 101, 2)array2# 通过函数linspace用间隔均匀的数字生成一维数组array3 = np.linspace(-5, 5, 80)array3# 通过随机的方式创建一维数组array4 = np.random.random(10)array4array5 = np.random.randint(10, 100, 10)array5array6 = np.random.normal(170, 7, 100)array6
# 用嵌套列表创建二维数组array7 = np.array([[1, 2, 3], [3, 4, 5], [5, 5, 6]])array7# 通过对一维数组调形创建二维数组array8 = np.random.randint(60, 101, 15).reshape((3, 5))array8# 创建全0,全1,指定元素的二维数组# array9 = np.zeros((5, 4), dtype=np.int)# array9 = np.ones((5, 4), dtype=np.int)array9 = np.full((5, 4), 100)array9# 创建单位矩阵array10 = np.eye(10)array10# 用随机的方式创建二维数组array11 = np.random.randint(60, 101, (5, 3))array11array12 = np.array(array11, dtype='d')array12
# 数组元素的个数array12.size# 数组元素的数据类型array12.dtype# 数组的维度(dimension)array12.ndim# 数组的形状array12.shape# 数组中每个元素占用的内存空间(字节)array12.itemsize# 数组总共占用的内存空间(字节)array12.nbytes
# 和描述性统计相关的方法print(array12.sum())print(array12.mean())print(array12.max())print(array12.min())print(array12.std())print(array12.var())# 在指定的轴上进行描述性统计运算print(array12.sum(axis=1))print(array12.mean(axis=0))array13 = np.random.randint(10, 101, 10)array13# 数组就地排序array13.sort()array13# 调用numpy的sort函数给数组排序,返回排好序的数组,原数组不变np.sort(array13)# 去重np.unique(array13)
索引
array13[0], array13[-1]# 数组的关系运算会产生一个布尔数组array13 > 50# 布尔索引(用布尔类型的数组作为索引,True对应的元素保留,False对应的元素去掉)array13[array13 > 50]# 可以用& 或者 | 对两个布尔数组进行运算,相当于Python中and 和 orarray15[(array15>50) & (array15%2==0)]array15[(array15>50) | (array15%2==0)]# 花式索引(fancy index)array15[[2,3,0,0,-1,-4,5,6]]
切片
array16=np.arange(1,10).reshape(3,3)array16"""array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])"""array16[1][0] #4array16[1,0] # 4#二维数组切片array16[1:,:2]"""array([[4, 5], [7, 8]])"""array16[::2,::2]"""array([[1, 3], [7, 9]])"""#花式索引array16[[0,1,2],[0,1,2]] #array([1, 5, 9])
# 读取图片创建三维数组guido = plt.imread('guido.jpg')guido.shape# 查看数组的维度guido.ndim# 通过数组显示图片plt.imshow(guido)# 通过切片实现抠图操作guido_head = guido[30: 350, 90: 310]plt.imshow(guido_head)# 垂直翻转plt.imshow(guido[::-1])# 水平翻转plt.imshow(guido[:, ::-1])plt.imshow(guido[:, :, ::-1])
转载地址:http://ikbvn.baihongyu.com/