numpy
tips:
核心特性
- 多维性:支持0维,1维,2维及更高维数组
arr = np.array(5) # 创建0维数组
arr = np.array([1,2,3]) # 创建1维数组
arr = np.array([[1,2,3],[4,5,6]]) # 创建2维数组
arr.ndim # 数组的维度
- 同质性:所有元素类型必须一致(通过dtype指定)
arr = np.array([1,'123']) # 不同数据类型会被强制转换成相同数据类型
arr = np.array([1,1.5])
arr
\(output\):
array(['1', '123'] array([1. , 1.5])
- 高效性:基于连续内存块存储,支持向量化运算
属性
- \(shape\):数组的形状(行数/列数)
- \(ndim\):维度数量
- \(size\):总元素个数
- \(dtype\):数组中元素的类型
- \(T\):转置(行变列,列变行)
- \(itemsize\):单个元素占用的内存字节数
- \(nbytes\):数组总内存占用量
- \(flags\):内存存储方式(是否连续存储)
ndarray的创建
基础创建方式
# 基础创建方式
list1 = [1,2,3]
arr = np.array(list1,dtype = int)
print(arr.ndim)
arr
copy
arr1 = np.copy(arr) # 元素跟原始的数组相同,但不是同一个数组
arr1[0] = 8
print(arr1)
print(arr)
预定义形状
# 预定义形状
# 全0 全1 未初始化 固定值
# 全0
arr = np.zeros((2,3))# 全1
arr = np.ones((2,3),dtype = int)
print(arr)# 未初始化(值随机)
arr = np.empty((2,3))
print(arr)# 固定值
arr = np.full((3,4),2,dtype = int)
print(arr)# 规定形状与谁一样
arr1 = np.zeros_like(arr)
arr1 = np.empty_like(arr)
arr1 = np.full_like(arr,2025,dtype = int)
arr1
等差数列
arr = np.arange(1,12,2).reshape(3,2)
arr
\(op\):
array([[ 1, 3],[ 5, 7],[ 9, 11]])
等间隔数列
# 等间隔数列
app = np.linspace(0,100,5)
app
\(op\):
array([ 0., 25., 50., 75., 100.])
对数间隔数列
# 对数间隔
arr = np.logspace(0,4,3,base = 2)
arr
\(op\):
array([ 1., 4., 16.])
base表示以几为底,0-4 分成3份
单位矩阵
# 特殊矩阵
# 单位矩阵:主对角线上的数字为1,其他数字为0
arr = np.eye(3) # 3行3列
arr# 非单位矩阵
arr = np.eye(3,4,dtype=int) # 3行4列
print(arr)
\(op\):
[[1 0 0][0 1 0][0 0 1][[1 0 0 0][0 1 0 0][0 0 1 0]]
对角矩阵
# 对角矩阵 主对角线上非零,其他数字为0
arr = np.diag([1,2,3])
print(arr)
\(op\):
[[1 0 0][0 2 0][0 0 3]]
随机数组
# 随机数组的生成
# 生成0-1之间的随机浮点数(均匀分布)
arr = np.random.rand(2,3)
print(arr)# 生成指定范围区间的随机浮点数
arr = np.random.uniform(3,6,(2,3))
print(arr)# 生成指定范围区间的随机整数
arr = np.random.randint(3,6,(2,3))
print(arr)# 生成随机数列(正态分布)
# 两边概率小,中间概率大
# -3 ~ 3 之间
arr = np.random.randn(2,3)
print(arr)# 随机种子
# 每次运行随机的结果一样
np.random.seed(20)
arr = np.random.randint(1,10,(2,5))
print(arr)
\(op\):
[[0.03662698 0.05935025 0.96815315][0.93762998 0.32943142 0.73241407]][[3.78802835 5.67615818 4.12618184][4.06410551 5.52066818 4.71513323][[4 3 4][4 5 5]][[ 0.99595732 -0.01888541 -0.43937749][-0.08584057 1.55598342 1.8797463 ]][[4 5 7 8 3][1 7 9 6 4]]
ndarray数据类型
索引与切片
一维数组
arr = np.random.randint(1,100,20)
# 基本索引
print(arr[0])
print(arr[1])# 切片(左闭右开)
print(arr[:]) # 全部
print(arr[:5]) # 0 ~ 4索引
print(arr[2:5]) # 2 ~ 4
print(arr[1:]) # 1 ~ 到最后# 布尔索引
print(arr[arr > 10]) # 打印arr中大于10的所有元素
print(arr[(arr > 10) & (arr < 70)]) # 打印arr中大于10小于70的所有元素# slice
# 与切片作用完全一样,这个只不过是用函数里面传参数
arr[slice(2,5)] # 2 ~ 4下标元素
print(arr[slice(0,6,3)]) # 0 ~ 5 步长为3
二维数组
arr = np.random.randint(1,100,(4,8))# 基础索引
print(arr[1][2]) # 2行3列
print(arr[0][0]) # 1行1列# 切片
print(arr[:3,:2]) # 0 ~ 2行 0 ~ 1列
print(arr[1:3,2:5]) # 1 ~ 2行 2 ~ 4列# 布尔索引
print(arr[arr > 40]) # 转换成1维列表
print(arr[2][arr[2] > 50]) # 2行中大于50的元素
print(arr[:,3][arr[:,3] > 10]) # 3列中大于10的元素
ndarray运算
数组与数组之间运算:
# np数组运算
# 一维
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a + b)
print(a - b)
print(a * b)
print(a / b)#二维
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[4,5,6],[7,8,9]])
print(a + b)
print(a - b)
print(a * b)
print(a / b)# 原生py
c = [1,2,3]
d = [4,5,6]
print(c + d)
\(op\):
[5 7 9]
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4 0.5 ][[ 5 7 9][11 13 15]]
[[-3 -3 -3][-3 -3 -3]]
[[ 4 10 18][28 40 54]]
[[0.25 0.4 0.5 ][0.57142857 0.625 0.66666667]][1, 2, 3, 4, 5, 6]
数字与数组的运算
# 数组与标量之间的算数运算
a = np.array([[1,2,3],[4,5,6]])
print(a + 3)
print(a * 3)
\(op\):
[[4 5 6][7 8 9]]
[[ 3 6 9][12 15 18]]
数组中每个元素都加上/乘数字
广播机制(不同形状数组之间的运算)
- 先看同一维度 如果相同/有一个为1 便可以广播
- 如何广播:
[1 2 3] -> [[1,2,3],[1,2,3],[1,2,3]]
[[4],[5],[6]] -> [[4,4,4],[5,5,5],[6,6,6]]
- 同形状之后进行运算
a = np.array([1,2,3])
b = np.array([[4],[5],[6]])
print(a + b)
print(a - b)op:
[[5 6 7][6 7 8][7 8 9]]
[[-3 -2 -1][-4 -3 -2][-5 -4 -3]]
1 * 3和1 * 2就不可以广播
矩阵运算
# 矩阵运算
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[4,5,6],[7,8,9],[1,2,3]])
print(a @ b)op:
[[ 21 27 33][ 57 72 87][ 93 117 141]]
基本数学函数
# 计算平方根
print(np.sqrt(9))
print(np.sqrt([1,4,9]))# 计算指数 以e^x为底
print(np.exp(1))# 计算对数 lnX
print(np.log(1))# 计算正弦值,余弦值
print(np.sin(-1))
print(np.cos(-1))# 计算绝对值
print(np.abs(-2))# 计算a的b次幂
print(np.power([1,2,3],2))
print(np.power([1,2,3],3))# 四舍五入
# 4.5 -> 4
# 4.56 -> 5
print(np.round([3.2,4.5,8.1,9.6]))# 向上/下取整
arr = np.array([1.6,25.1,81.7])
print(np.ceil(arr))
print(np.floor(arr))# 检测缺失值Nan
np.isnan([1,2,3,np.nan,3])op:
3.0
[1. 2. 3.]2.7182818284590450.0-0.8414709848078965
0.54030230586813982[1 4 9]
[ 1 8 27][ 3. 4. 8. 10.][ 2. 26. 82.]
[ 1. 25. 81.]array([False, False, False, True, False])
统计函数
# 求和
print(np.sum(arr))
print(np.sum([1,2,3]))# 计算平均值
print(np.mean(arr))
print(np.mean([1,2,3]))# 计算中位数
# 奇数:排序后中间的数值
# 偶数:排序后中间两个数的平均值
print(np.median([4,1,2]))
print(np.median([1,2,4,8]))# 计算标准差,方差
# 计算平均值
# 计算 方差 = (xi - avg)^2 + ... / n
# 标准差 = 方差开根
print(np.var([1,2,3]))
print(np.std([1,2,3]))# 计算最大值/最小值
print(np.max(arr))
print(np.min(arr))# 计算索引值
print(np.argmax(arr))
print(np.argmin(arr))# 计算分位数
np.percentile(arr,100)# # 前缀和/积数组,
arr = np.array([1,2,3])
print(np.sum(arr))
print(np.cumsum(arr))
print(np.cumprod(arr))op:
98
612.25
2.02.0
3.00.6666666666666666
0.81649658092772619
56
1np.float64(19.0)6
[1 3 6]
[1 2 6]
比较函数
# 是否大于
print(np.greater([3,4,5,6,7],4))
# 是否小于
print(np.less([3,4,5,6,7],4))
# 是否等于
print(np.equal([3,4,5,6,7],[3,4,5,6,7]))# 逻辑与或非
print(np.logical_and([0,0],[1,5]))
print(np.logical_or([0,0],[1,5]))
print(np.logical_not([1,5]))# 检查元素是否至少有一个元素为True
print(np.any([0,0,0,0]))
# 检查元素是否全部都是True
print(np.all([0,1,0,0]))# 自定义条件 支持嵌套
arr = np.array([1,2,3,4,5])
print(np.where(arr > 3,arr,0))# np.select(条件,返回的结果)
print(np.select([arr > 3,arr < 3],[0,1]))op:
[False False True True True]
[ True False False False False]
[ True True True True True][False False]
[ True True]
[False False]False
False[0 0 0 4 5][1 1 0 0 0]
排序函数
# 排序函数
np.random.seed(0)
arr = np.random.randint(1,100,20)
print(arr)
print(np.sort(arr))
print(np.argsort(arr)) # 排序后的元素在原数组中的下标
print(arr)# 去重+排序函数
print(np.unique(arr))# 数组拼接
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
print(arr1 + arr2)
print(np.concatenate((arr1,arr2)))# 数组的分割 必须整除
print(np.split(arr1,3))# 调整数组形状
print(np.reshape(arr,[2,10]))
print(np.reshape(arr,[5,4]))op:
[45 48 65 68 68 10 84 22 37 88 71 89 89 13 59 66 40 88 47 89]
[10 13 22 37 40 45 47 48 59 65 66 68 68 71 84 88 88 89 89 89]
[ 5 13 7 8 16 0 18 1 14 2 15 3 4 10 6 9 17 11 12 19]
[45 48 65 68 68 10 84 22 37 88 71 89 89 13 59 66 40 88 47 89][ 2 6 7 10 12 13 17 19 21 26 29 38 51 65 72 73 76 77 80 85][5 7 9]
[1 2 3 4 5 6][array([1]), array([2]), array([3])][[45 48 65 68 68 10 84 22 37 88][71 89 89 13 59 66 40 88 47 89]]
[[45 48 65 68][68 10 84 22][37 88 71 89][89 13 59 66][40 88 47 89]]
pandas
series
series创建
# series创建
import pandas as pd
s = pd.Series([20,1,2,3,4])# 自定义索引
s = pd.Series([10,2,3,4,5], index=['a','b','c','d','e'])
s = pd.Series([10,2,3,4,5], index=['1','2','3','4','5'])# 定义name(描述这一列是什么意思的)
s = pd.Series([10,2,3,4,5], index=['1','2','3','4','5'],name = '月份')# 通过字典方式创建
s = pd.Series({'a':1,'b':2,'c':3,'d':4,'e':5})# 从原来列表基础上获取
s1 = pd.Series(s,index=['a','c'])op:
0 20
1 1
2 2
3 3
4 4
dtype: int64
1 10
2 2
3 3
4 4
5 5
dtype: int64
1 10a 1
b 2
c 3
d 4
e 5
dtype: int64
a 1
c 3
dtype: int64
series属性
显式可以用自定义索引去获取元素,隐式则是按照下标来获取
-
显示中\(loc\)支持切片(两边均闭),\(at\)不支持切片
-
隐式支持切片(左闭右开)
访问元素
# 访问数据
# print(s[0]) # 可能会跟你自定义索引混淆不推荐使用
print(s['a']) # 用自定义索引
print(s[s < 3]) # 布尔索引
print(s.head()) # 返回数据前五行信息
s['f'] = 6 # 添加元素
print(s.tail()) # 返回数据后5行
常用方法
DataFrame
创建
# 通过series创建
s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([6,7,8,9,10])
df = pd.DataFrame({'第一列':s1,'第二列':s2})
print(df)# 通过字典来创建
df = pd.DataFrame({"name":['tom','jack','Eric','Apple','Faker'],'age':[12,23,24,24,25],'score':[32,36,87,68,89]},index=[1,2,3,4,5],columns=['name','score','age']
)
df
\(op\):
属性
访问数据
# 获取单列数据
print(df['score'])
df.score# 获取多列数据
df[['name','score']]# 布尔索引(数据筛选)
print(df[df.score > 60])
print(df[(df.score > 60) & (df.age < 30)])
op:
常用方法
数据分析步骤
- 数据收集
- 数据清洗
- 数据分析
- 数据可视化
数据导入/导出
# 导入csv文件
import pandas as pd
df = pd.read_csv('文件路径')# 导出csv文件
df.to_csv('文件路径')# 导入json文件
# 1. pd读json
df = pd.read_json('')# 2. json工具包
import json
with open('') as f:data = json.load(f)
df = pd.DataFrame(data['data'])