0.前言
-
NumPy是什么?Numerical Python(数值型Python)
-
一个开源的Python科学计算库
-
-
使用NumPy可以干什么?
-
可以使用数组和矩阵
- 一些数学函数
- 线性代数运算
- 傅里叶变换
- 随机数的生成
-
- NumPy的由来:1995年提出--2001年启动---2005正式整合--2006年发布1.0版本。
-
为什么使用NumPy?可以直接操作数组和矩阵,编写起来更轻松,且数学函数众多。
-
NumPy中数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构(如嵌套的list容器),只是通用性没有原生的Python容器好。
-
NumPy的大部分代码都是用C语言写成的,这使得NumPy比纯Python代码高效得多。
- 局限性:Jython运行在Java虚拟机上,无法调用NumPy,因为大部分NumPy模块是用C语言实现的。
- 支持的数据类型
1.科学计算工具Numpy
- 例子1:向量加法(数学上的一位数组)
- 题目:向量a是0-n的整数的平方、向量b是0-n的整数的立方---->n=3 a:0、1、4 b:0、1、8
- python的写法
-
def pythonsum(n): a = [i for i in range(n)] b = [i for i in range(n)] c = [] for i in range(len(a)): a[i] = i ** 2 b[i] = i ** 3 c.append(a[i] + b[i]) return c c = pythonsum(1000) print(c)
-
-
Numpy的写法
-
import numpy as np def numpysum(n): a = np.arange(n) ** 2 b = np.arange(n) ** 3 c = a + b return c c2 = numpysum(1000)
-
-
1、ndarray 多维数组(N Dimension Array)
-
ndarray的下标从0开始,且数组里的所有元素必须是相同类型
-
ndarray拥有的属性
-
ndim属性
:维度个数 shape属性
:维度大小-
dtype属性
:数据类型
-
- 例子:ndarray随机创建用来生成随机数据
-
# 1.导入numpy,别名np import numpy as np # 2.生成指定维度大小的随机多维浮点型数据(3行4列) arr = np.random.rand(3, 4) # <class 'numpy.ndarray'> print(arr, type(arr)) # 3.生成指定维度大小(3行4列)的随机多维整型数据(二维),randint()可以指定区间(-1, 5) arr1 = np.random.randint(-1, 5, size=(3, 4)) # 'size='可省略 print(arr1, type(arr1)) # 4.生成指定维度大小(3行4列)的随机多维浮点型数据(二维),uniform()可以指定区间(-1, 5) arr2 = np.random.uniform(-1, 5, size=(3, 4)) print(arr2, type(arr2)) # 5.三个属性:维度个数、维度大小、数据类型 print( '维度个数(几维):', arr.ndim, '维度大小(几行几列):', arr.shape, '数据类型:', arr.dtype, )
-
-
-
ndarray的序列创建
-
import numpy as np # 1.np.array(collection) # collection 为 序列型对象(list)、嵌套序列对象(list of list)。 lis = range(10) lis_lis = [range(10), range(10)] arr = np.array(lis) arr_arr = np.array(lis_lis) print(arr, arr_arr, type(arr), type(arr_arr)) print(arr.ndim, arr.shape) print(arr_arr.ndim, arr_arr.shape) # 2.np.zeros 指定大小的全0数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。 lis1 = np.zeros((3, 4)) print(lis1) # 3.np.ones() 指定大小的全1数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。 lis2 = np.ones((3, 4)) print(lis2) # 4.np.empty() 初始化数组,不是总是返回全0,有时返回的是未初始的随机值(内存里的随机值)。 # np.empty 指定数据类型 lis3 = np.empty((3, 4), int) print(lis3) # 5.np.arange() 和 reshape() # arange() 类似 python 的 range() ,创建一个一维 ndarray 数组。 lis4 = np.arange(15) print(lis4) # reshape() 将重新调整数组的维数。 lis5 = lis4.reshape(3, 5) print(lis5) lis6 = lis4.reshape(1, 3, 5) print(lis6) # 6.ndarray的数据类型 dtype参数和astype方法 # 初始化3行4列数组,数据类型为float64 lis7 = np.zeros((3, 4), dtype=np.float64) print(lis7) # astype转换数据类型,将已有的数组的数据类型转换为int32 lis8 = lis7.astype(np.int32) print(lis8)
-
-
ndarray的矩阵运算
-
import numpy as np # 1.矢量运算:相同大小的数组间运算应用在元素上 # 数组内元素相乘 lis = np.array([[1, 2, 3], [4, 5, 6]]) # 表示所有元素按索引对应相乘 lis1 = lis * lis print(lis1) # 矩阵相加 lis2 = lis + lis print(lis2) # 2.矢量和标量运算:"广播" - 将标量"广播"到各个元素 # 1除以lis内每个元素 lis3 = 1. / lis # 2乘以lis内每个元素 lis4 = 2. * lis print(lis3) print(lis4) # 3.ndarray的索引与切片 # 一维数组的索引和切片,同list lis5 = np.arange(10) print(lis5[2:5]) # 多维数组的索引和切片 lis6 = np.arange(12).reshape(3, 4) print(lis6[1]) print(lis6[0:2, 2:]) # 逗号前面代表维度,逗号后面代表每个维度的切片 print(lis6[:, 1:3]) # 条件索引 # 注意,多个条件组合要使用 & | 连接,而不是Python的 and or。 lis7 = np.random.rand(3, 3) year_lis7 = np.array([[2000, 2001, 2000], [2005, 2002, 2009], [2001, 2003, 2010]]) is_year_after_2005 = year_lis7 >= 2005 # 如果满足条件就返回True,反之False print(is_year_after_2005) filterd_arr = year_lis7[is_year_after_2005] # 直接写条件也一样 filterd_arr1 = year_lis7[year_lis7 >= 2005] print(filterd_arr) print(filterd_arr1) # 多个条件 filterd_arr2 = year_lis7[(year_lis7 <= 2005) & (year_lis7 % 2 == 0)] print(filterd_arr2) # 4.ndarray的维数转换:数组的转置 # 二维数组直接使用转换函数:transpose() lis8 = np.random.rand(2, 3) print(lis8) print(lis8.transpose()) # 多维 lis9 = np.random.rand(2, 3, 4) # 2x3x4 数组,2对应0,3对应1,4对应3 print(lis9) print(lis9.transpose((1, 0, 2))) # 根据维度编号,转为为 3x2x4 数组
-
-
ndarray的元素处理
-
import numpy as np # 1.元素计算函数 # randn()返回具有标准正态分布的序列 lis = np.random.randn(2, 3) print(lis) # 向上取整 print(np.ceil(lis)) # 向下取整 print(np.floor(lis)) # 四舍五入 -0.5 变成 -1 print(np.rint(lis)) # 判断元素是否不是一个数字:是数字False 不是Ture Not a Number print(np.isnan(lis)) # 元素相乘:对应元素相乘 print(np.multiply(lis, lis)) # 元素相除 print(np.divide(lis, lis)) # 元素的绝对值 print(np.abs(lis)) # 元素操作的三元运算符 三元运算符,x if condition else y print(np.where(lis > 0, 1, -1)) # 2.元素统计函数 # 所有元素的平均值 print(np.mean(lis)) # 所有元素的和 print(np.sum(lis)) # 按照行统计 print(np.sum(lis, axis=1)) # 按照列统计 print(np.sum(lis, axis=0)) # 所有元素的最大值和最小值 print(np.max(lis)) print(np.min(lis)) # 所有元素的标准差和方差 print(np.std(lis)) print(np.var(lis)) # 最大下标索引和最小下标索引 print(np.argmax(lis)) print(np.argmin(lis)) # 返回一个一维数组,每个元素都是之前所有元素的 累加和 和 累乘积, print(np.cumsum(lis)) print(np.cumprod(lis)) # 3.元素判断函数 # 至少有一个元素满足返回Ture, OR print(np.any(lis > 0)) # 所有元素满足才返回Ture, AND print(np.all(lis > 0)) # 4.元素去重排序函数 # 找到唯一值并返回排序结果 arr = np.array([[1, 2, 1], [2, 3, 4]]) print(arr) print(np.unique(arr))
-
02.数据分析工具Pandas
- 什么是Pandas? Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
-
Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了 高级数据结构 和 数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。
-
- Pandas能做什么?
-
一个强大的分析和操作大型结构化数据集所需的工具集
-
基础是NumPy,提供了高性能矩阵的运算
-
提供了大量能够快速便捷地处理数据的函数和方法
-
应用于数据挖掘,数据分析
-
提供数据清洗功能
-
- Pandas的数据结构
-
Pandas有两个数据结构:Series 和 DataFrame
-
Series 类似链表,索引在前,数据在后
-
-