欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)  
相关标签: 数据