NumPy数据分析库
pandas 机器学习 人工智能 等的底层支持
主要内容:
文章目录
1. NumPy 简介
- 高性能科学计算和数据分析的基础包
部分功能 - ndarray 具有适量算术元算和复杂广播能力的多维数据,快速且节省空间
- 对整组数据进行快速运算的标准数学函数,无需编写循环
- 读写磁盘数据的工具 操作内存映射文件
- 线性代数、随机数生成、傅里叶变换
- 集成由C、C++、Fortran等语言编写的代码的工具
2. NumPy 数组对象——ndarray
- 快速而灵活的大数据集容器
- 可以对整块数据执行一些数学运算
- 多维数组对象,由两部分组成:①实际数据 ②描述这些数据的元数据
举例1:python 与numpy 对比
python数组操作
numList = list(range(1,10))
numList
numList**0.5 #error!
newNumList = []
for n in numList:
newNumList.append(n**0.5)
newNumList
用numpy 做数组操作
import numpy as np
np.arange(1,10)
arr = np.arange(1,10)**0.5
arr.dtype #描述元数据
np.arange(1,121).reshape((2,3,4,5))**0.5 #四维数组
举例2:
data1 = list(range(10,20,2))
data1
arr1 = np.array(data1) #将集合类型转换成ndarray类型
type(arr1)
arr2 = np.arange(1,22).reshape(3,7)
arr2
arr2[0]
arr2[0][3] #python、numpy通用
arr2[0,3] # numpy独有
3 numpy相关属性
获取ndarray对象的维度
arr1.ndim,arr2.ndim
获取行列信息
arr2.shape
arr1.shape
创建数组类型
np.ones((3,5)) #默认数据类型为float
np.ones((3,5),dtype=np.str_) #显示设置数据类型
4 Numpy数据类型
dtype(数据类型) 将一块内存解释为特定数据类型所需信息
- int8/16/32/64 uint8/16/32/64
有符号和无符号的8/16/32/64位(1/2/4/8字节)整型 - float16/32/64/128
- str_
- bool
- object
- string_
- unicode_
固定长度的Unicode类型(字节数由平台决定)中文 Linux占3字节,Windows占2字节
举例3:NumPy 模拟商品数据类型
模拟:产品名称、产品销量、产品单价、生产厂家
t = np.dtype([('name',np.str_,40),('nums',np.int32),('price',np.float32),('company',np.str_,40)])
t
sqldata = [('小米 Mix 2手机',20000,1999.00,'小米科技'),('华为honor 12手机',30000,2999,'华为集团')]
type(sqldata)
#np.array(sqldata) #数据默认字符串类型
test = np.array(sqldata,dtype=t) #为了节约空间大小,float小数点后若是0就不显示
test
linspace() 产生等间隔值
np.linspace(1,10) #产生1-10之间的等间隔值
np.linspace(1,10,8) #产生8个1~10之间的等间隔值
np.linspace(1,10,8,endpoint=False) #不包含最后一个间隔值
4.1 NumPy数组与标量之间的运算
定义两个矩阵:
data1 = np.arange(1,13).reshape((3,4))
data1
data2 = np.arange(13,25).reshape((3,4))
data2
矩阵元素相乘(可做加、减、乘、除、取模等运算)
data1*data2
矩阵元素求倒数
1/data2
4.2 NumPy基本索引与切片
选取数据子集或单个元素
arr3 = np.arange(20)
arr3[3:5] = 20
arr3
切片自动传播
原理:将切片赋给一个变量时,给的是一个映射视图,实际上变量与原数据是挂钩的,映射数据改变时,原数据发生同步改变。(深拷贝和浅拷贝)
cellData = arr3[5:11]
cellData[:] = 333
cellData
**输出:
array([333, 333, 333, 333, 333, 333])
arr3
**输出:
array([ 0, 1, 2, 20, 20, 333, 333, 333, 333, 333, 333, 11, 12,
13, 14, 15, 16, 17, 18, 19])
可以看见,arr3对应位置的数值发生了改变
copy() 拷贝
arr4 = np.arange(20)
arr4
copyData = arr4[4:11].copy()
copyData[:] = 333
copyData
**输出:
array([333, 333, 333, 333, 333, 333, 333])
arr4
**输出:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
4.3 改变数组维度
- ravel() 展平成一维数组,返回数组的一个视图(原数据会改变)
- flatten() 展平成一维数组,请求分配内存来保存结果(元素据不改变)
- shape() 用元组设置维度
- tarnsope() 矩阵转置
- resize() 更改维度
举例1:矩阵转置
tdata = np.arange(1,21).reshape((4,5))
tdata.transpose()
tdata.T #矩阵转置,功能同上
举例2:更改矩阵维度
tdata.resize((2,10))
tdata
**输出:
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])
tdata.shape = (4,5)
tdata
**输出:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
4.4 更多索引
- 切片索引 可以在一个或多个维度上切片
- 布尔值索引 由布尔值数组作为索引
- 花式索引 用整数数组进行索引
举例1:二维数组切片索引
import numpy as np
arr2d = np.arange(1,25,2).reshape((3,4))
arr2d
arr2d[1,2:]
arr2d[2,1]
arr2d[2,:1]
arr2d[:,1]
arr2d[:2,1:3]
arr2d[:,1::2]
举例2:布尔值索引
默认线性:纵向
HTML中的左右表格合并:列合并 上下表格合并:行合并
moni_citys = np.array(['SH','BJ','CQ','SH','BJ','BJ','CQ'])
moni_citys
moni_data = np.random.randn(7,8)*2 #正态分布高斯样本值
moni_data
moni_citys == 'BJ' #关系运算,返回bool类型
moni_data[moni_citys == 'BJ']
moni_data[moni_citys == 'BJ',2:]
做逻辑运算:
moni_citys != 'BJ'
moni_citys > 'BJ'
moni_data >= 2.5
moni_data[moni_data < 2.5] = 0
moni_data
moni_data[moni_data > 3] = 2
moni_data
类似数据库查询推断 where stu_id == ‘’ 后台程序筛选:读取stu_id,从上往下走,如果判断成立,true,保留;如果判断不成立,false,忽略。
举例3:花式索引
data = np.arange(100).reshape((10,10))
data[[3,0,4,2]]
data[[3,0,4,2],[5,7,6,1]]
data[[3,0,4,2]][:,[5,7,6,1]] # :找出的行都保留 ,列按照要求排列
5 NumPy数组对象的相关操作
5.1 数组组合
NumPy数组有:水平组合、垂直组合、深度组合
- vstackd() 垂直组合
- stack() 兼容多种组合
- hstack() 水平组合
- row_stack()
- column_stack()
- concatenate()