NPM(更新中)
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.718281828459045
0.0
-0.8414709848078965
0.5403023058681398
2
[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
6
12.25
2.0
2.0
3.0
0.6666666666666666
0.816496580927726
19
5
6
1
np.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 10
a 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'])