python库 numpy基础,详解与实践
程序员文章站
2022-03-03 19:52:13
...
1. NumPy基础 —— 是什么
- NumPy是SciPy、Pandas 等数据科学的基础库
- 提供的数据结构比 Python 自身的“更高级、更高效”
1.1 ndarray 多维数组
1.1.1 创建数组
import numpy as np
a = np.array(['1', '2', '3'])
b = np.array([['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']])
print(a.shape)
print(b.shape)
# 输出
(3,)
(3, 3)
1.1.2 结构数组,需要标注清晰含义时
persontype = np.dtype({
'names':['name', 'age', 'chinese', 'math', 'english'],
'formats':['S32','i', 'i', 'i', 'f']})
peoples = np.array([("ZhangFei",32,75,100, 90),("GuanYu",24,85,96,88.5),
("ZhaoYun",28,85,92,96.5),("HuangZhong",29,65,85,100)],
dtype=persontype)
print(peoples.dtype)
# 输出
[('name', 'S32'), ('age', '<i4'), ('chinese', '<i4'), ('math', '<i4'), ('english', '<f4')]
dtype含义,如 <U1
- <表示字节顺序,小端(最小有效字节存储在最小地址中)
- U表示Unicode,数据类型
- 1表示元素位长,数据大小
- S只支持ascii码
1.1.3 创建连续数组
import numpy as np
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
print(x1[1])
print(x2[1])
# 输出
3
3.0
- arange 初始值,终值,步长
- linspace 初始值,终值,元素个数
- 区别:linspace 创建的是浮点型;默认包含终值
1.2 ufunc 对数组进行处理的函数
1.2.2 算术运算
含义 | 示例 | |
---|---|---|
add | 加 | np.add(x1, x2) |
subtract | 减 | np.subtract(x1, x2) |
multiply | 乘 | np.multiply(x1, x2) |
divide | 除 | np.divide(x1, x2) |
power | 对x1元素求x2次方 | np.power(x1, x2) |
remainder | 取余 | np.remainder(x1, x2) |
power示例
import numpy as np
x1 = np.array([10, 100, 1000])
x2 = np.array([1, 2, 3])
print(np.power(x1, x2))
# 输出
[ 10 10000 1000000000]
1.2.3 统计函数
含义 | 示例 | |
---|---|---|
amin | 数组/矩阵中的最小值 | np.amin(a) |
amax | 数组/矩阵中的最大值 | np.amax(a) |
ptp | 最大值与最小值差 | np.ptp(a) |
percentile | p% 的百分位数 | percentile(a, 50),50%即平均值 |
median | 中位数 | np.median(a) |
mean | 平均值 | np.mean(a) |
average | 加权平均值 | np.average(a,weights=wts) |
std | 标准差 | np.std(a) |
var | 方差 | np.var(a) |
轴的含义
import numpy as np
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print(np.ptp(a))
print(np.ptp(a,0))
print(np.ptp(a,1))
# 输出
8
[6 6 6]
[2 2 2]
- 0表示,沿着axis=0 轴的最大值与最小值之差
- 0 为列的维度;1为行的维度
1.2.3 排序
a = np.array([[4,3,2],[2,4,1]])
print(np.sort(a))
print(np.sort(a, axis=None, kind='quicksort'))
print(np.sort(a, axis=0, kind='mergesort'))
print(np.sort(a, axis=1) )
# 输出
[[2 3 4]
[1 2 4]]
[1 2 2 3 4 4]
[[2 3 1]
[4 4 2]]
[[2 3 4]
[1 2 4]]
- axis 默认是 -1,即沿着数组的最后一个轴进行排序
- axis=None 代表采用扁平化的方式作为一个向量进行排序
2. NumPy详解 —— 为什么
2.1 为什么要用NumPy数组结构而不是python的list ?
python list | numpy数组 | |
---|---|---|
底层数据 | 其实是数组,比如[0,1,2],则需要保存3个指针和3个整数的对象 | Q1不用指针,那如a[0]是如何进行数据读取 ? |
内存空间 | 分散存储 | 连续的内存块,遍历时不需对内存地址查找,节省计算资源 |
是否可用到SIMD | 否 | 是。由于在连续内存块中 |
多线程 | 否,GIL锁 | numpy内部由C实现,不经过python解释器,本身到矩阵运算可以多线程 |
- 避免采用隐式拷贝,而是采用就地操作的方式。如 x*=2,而不是 y=x*2。
2.1.1 现代CPU矢量化指令计算
- SIMD单指令流多数据流(SingleInstruction Multiple Data,SIMD)
- 对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术
2.1.2 python GIL锁
- GIL,全称 Global Interpreter Lock ,全局解释锁
- gil是一个互斥锁,用来保护对python对象的访问,防止多个线程同时执行python字节码
3. NumPy实践 —— 怎么用
如: 假设一个团队里有 5 名学员,成绩如下表所示。NumPy 统计这些人在语文、英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。然后把这些人的总成绩排序,得出名次进行成绩输出:
如(数组定义见下侧):
print('chinese mean', np.mean(score[:]['chinese']))
print('english mean', np.mean(score[:]['english']))
print('math mean', np.mean(score[:]['math']))
print('chinese min', np.amin(score[:]['chinese']))
print('english min', np.amin(score[:]['english']))
print('math min', np.amin(score[:]['math']))
求总和并排序的方式
- 数组初始化时,直接增加一列total, 赋值
score[:]['total'] = score[:]['chinese']+score[:]['english']+score[:]['math']
print('sum rank', np.sort(score, order='total'))
- python sorted方法,lambda
rank = sorted(score, key=lambda x:x[1]+x[2]+x[3], reverse=True)
# 按照参数x中的x[1]+x[2]+x[3]之和进行排序
lambda作为表达式,实际上定义了匿名函数
Q2 二维数组定义时的[], () ?
如二维数组定义,以下均可:
a = np.array([['1', '2'], ['3', '4']])
b = np.array([('1', '2'), ('3', '4')])
出现错误场景:
scoretype = np.dtype({
'names': ['name', 'chinese', 'english', 'math'],
'formats': ['S20', 'i', 'i', 'i']
})
# 正确
score = np.array([('zhangfei', 66, 65, 30),
('guanyu', 95, 85, 98),
('zhaoyun', 93, 92, 96)], dtype=scoretype)
# 错误
score = np.array([['zhangfei', 66, 65, 30],
['guanyu', 95, 85, 98],
['zhaoyun', 93, 92, 96]], dtype=scoretype)
上一篇: 封装 返回数据 统一异常管理
下一篇: jquery input输入自动补全