NumPy
NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。
目录
一、NumPy基础
二、NumPy数组
1.创建数组(从Python列表创建数组)
2.快速创建数组(通过函数创建数组)
3.创建随机数组
4.数组属性
5.NumPy数据类型
6.数据类型转换
7.数组索引
8.花哨索引
9.数组重新塑形
10.数组拼接
11.数组分裂
三、Numpy运算
1.算术运算
2.统计运算
3.数据选取
4.广播
5.矩阵运算
6.轴变换
四、数组的排序
五、NumPy结构化数组
一、NumPy基础
1.安装NumPy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ numpy
2.库导入
import numpy as np
二、NumPy数组
<class 'numpy.ndarray'>
NumPy提供了一个N维数组的类型,即ndarray,它描述了相同类型的“items”的集合。 可以使用例如整数的N来索引项目(items)。
1.创建ndarray数组(从Python列表创建数组)
从Python列表创建
np.array(序列对象)
返回一个ndarray对象。
注意:ndarray中所有元素数据类型一致。
如果传入了拥有不同类型元素的列表,array方法会尝试自动转换。
2.快速创建数组(通过函数创建数组)
- 1.创建数值为浮点0的数组
# 创建n_x维向量
dw = np.zeros((n_x,1))
# 创建m*n矩阵
matrix = np.zeros((m,n))
# 创建m*n*k张量
tensor = np.zeros((m,n,k))
- 2.创建数值为浮点1的数组
np.ones()
示例:
- 3.创建空数组(数据随机)
np.empty()
- 4.创建指定值的数组
np.full(形状, 填充值)
示例:
- 5.创建单位矩阵
np.eye(阶数)
- 6.创建等差数列
np.arange(start, stop, step)
np.linspace(start, stop, num)
3.创建随机数组
伪随机数种子设置
np.random.seed(0)
- 1.均匀分布
# 创建指定形状的数组(数值范围在0至1之间)
np.random.rand(形状)
np.random.random((形状))
# 创建指定范围内的一个数
np.random.uniform(a,b)
# 创建指定范围内的一个整数
np.random.randint(a,b)
示例:
- 2.正态分布(高斯分布)
np.random.normal(loc=0.0, scale=1.0, size=None)
loc:μ,概率分布的均值。
scale:σ,概率分布的标准差。对应于分布的宽度,越大越矮胖,越小越瘦高。
size:返回数组的形状(标量、向量、矩阵、张量)。
快速生成高斯分布数组:
np.random.randn(形状)
4.数组属性
属性 | 说明 |
---|---|
.size | 数组元素个数 |
.shape | 数组形状 |
.ndim | 数组维度 |
.dtype | 数组元素类型 |
.itemsize | 每个元素的大小(单位:bytes) |
.nbytes | 整个数组的大小(单位:bytes) |
5.NumPy数据类型
数据类型 | 类型代码 | 说明 |
---|---|---|
int8 uint8 | i1 u1 | 有符号/无符号8位(1字节)整型 |
int16 uint16 | i2 u2 | 有符号/无符号16位(2字节)整型 |
int32 uint32 | i3 u3 | 有符号/无符号32位(4字节)整型 |
float16 | f2 | 半精度浮点型 |
float32 | f4或f | 标准单精度浮点型 |
float64 | f8或d | 双精度浮点型 |
bool | ? | 布尔类型 |
object | O | Python对象 |
unicode_ | U | 固定长度Unicode类型(字符串类型) |
6.数据类型转换
new_array = origin_array.astype(np.数据类型)
注意:浮点型转整型会直接截断小数部分。
注意:astype是返回一个原数组的拷贝,而非对原数组做更改。
- 含数字和小数点字符串可以转换为浮点型,不能直接转换为整型(可先转换为浮点型,再转换为整型)。
-
仅含数字的字符串可以直接转换为整型。
示例:
7.数组索引
(1)下标访问
可通过下标访问数组元素。
(2)切片
与python语法一致
array[start: stop: step]
多为数组切片
array[start: stop: step, start: stop: step, ......]
注意:通过切片选取后产生的数组是原数组的视图,而非数组的副本。
警告:修改切片会导致原始数组也被修改。
(3)拷贝副本
array_copy = array.copy()
8.花式索引(花哨索引)
花式索引(花哨索引):利用整数数组进行索引
(1)花哨索引
array[索引数组]
注意:利用花哨索引选出来的结果,与索引数组的形状保持一致,而非与被索引的数组保持一致。
示例:
-
花哨索引也适用多维索引
等效于选取选取x[0, 2], x[1, 1], x[2, 3]
(2)组合索引
组合索引:花哨索引和其他索引方式组合起来的索引方式
①花哨索引与普通索引组合使用
x[2,[0, 1, 2]]等效于选择x[2,0], x[2,1], x[2,2]
②花哨索引与切片组合使用
③花哨索引与掩码组合使用
选择第一列和第三列
(3)使用花哨索引修改值
x[[0, 0]] = [4, 6]等效于先执行x[0] = 4,后执行x[0] = 6
(4)使用花哨索引进行累加
at()函数
np.通用函数.at(被操作数, 操作数, 循环次数)
示例:
9.数组重新塑形
(1)reshape
arr.reshape((形状))
(2)newaxis
# 新建行轴
array[np.newaxis, :]
# 新建列轴
array[:, np.newaxis]
10.数组拼接
可以一次拼接两个以上的数组
np.concatenate([数组1, 数组2, 数组3, ......], axis=拼接轴)
简化版拼接函数
1.np.vstack():垂直栈
2.np.hstack():水平栈
11.数组分裂
np.split(array, [分割点1, 分割点2, ......])
示例:
简化版分割函数
1.np.vsplit():垂直分割
2.np.hsplit():水平分割
示例:
三、Numpy运算
1.算术运算
直接对ndarray对象进行算术运算操作,相当于对对象中的每个元素进行该算术运算操作。
运算符 | 通用函数 | 描述 |
---|---|---|
+ | np.add | 加法运算 |
- | np.substract | 减法运算 |
- | np.negative | 负数运算 |
* | np.multiply | 乘法运算 |
/ | np.divide | 除法运算 |
// | np.floor_divide | 整除 |
** | np.power | 指数运算 |
% | np.mod | 模运算 |
示例:
matrix = np.random.normal(0,1,(3,3))
print(matrix)
print(matrix + 10)
print(matrix > 0.5)
2.统计运算(算术聚合运算)
np.通用函数.reduce()
np.聚合函数(数组, axis=聚合维数)
函数名称 | NaN安全版本 | 描述 |
---|---|---|
np.sum | np.nansum | 计算所有元素的和 |
np.prod | np.nanprod | 计算所有元素的积 |
np.mean | np.nanmean | 计算所有元素的均值 |
np.std | np.nanstd | 计算所有元素的标准差 |
np.var | np.nanvar | 计算所有元素的方差 |
np.min | np.nanmin | 求所有元素的最小值 |
np.max | np.nanmax | 求所有元素的最大值 |
np.argmin | np.nanargmin | 求最小值索引 |
np.argmax | np.nanargmax | 求最大值索引 |
np.median | np.nanmedian | 求所有元素的中位数 |
np.percentile | np.nanpercentile | 计算基于元素排序的统计值 |
np.any | N/A | 验证是否有任何一个元素为真 |
np.all | N/A | 验证所有元素是否为真 |
3.数据选取
array[条件表达式]
(1)比较运算符
运算符 | 通用函数名称 |
---|---|
== | np.equal |
!= | np.notequal |
< | np.less |
<= | np.less_equal |
> | np.greater |
>= | np.greater_equal |
(2)逻辑运算符
运算符 | 通用函数名称 |
---|---|
& | np.bitwise_and |
| | np.bitwise_or |
~ | np.bitwise_not |
^ | np.bitwise_xor |
示例:
(3)掩码
可通过掩码数组选取数组元素(花哨索引)
array[掩码数组]
4.广播
广播(broadcasting)指的是不同形状的数组之间的算术运算的执行方式。
示例:
5.矩阵运算
np.dot(数组1, 数组2, out = None)
若两数组均为向量,则返回两向量的点积。
若两数组均为矩阵,则返回矩阵内积。
6.轴变换
(1)矩阵转置
array.T只适用于矩阵转置
array.T
(2)高维数组轴变换
- 1.array.transpose()方法
array.transpose()方法支持重新设置轴次序
array.transpose(轴次序)
- 2.arr.swapaxes()方法
arr.swapaxes()方法只接受一对轴的轴变换
arr.swapaxes(轴1, 轴2)
四、数组的排序
1.np.sort()
- 1.生成副本
np.sort()方法会生成一个副本返回。
np.sort(数组, axis=排序轴)
- 2.就地排序
array.sort()
2.np.argsort()
np.argsort()方法返回排序后的索引
示例:
3.部分排序(分隔)
np.partition()方法排序后,最左边是数组中最小的k个值
np.partition(array, k)
示例:
五、NumPy结构化数组
1.定义结构化数组
'names':规定了数据的属性名
'formats':规定了对应属性的数据类型
data = np.zeros(元素个数, dtype={'names': ('变量名1', '变量名2', ......), 'formats': ('变量1数据类型', '变量2数据类型', ......)})
类型名 = np.dtype({'names': ('变量名1', '变量名2', ......), 'formats': ('变量1数据类型', '变量2数据类型', ......)})
np.zeros(元素个数, dtype=类型名)
数据类型
NumPy数据类型符号 | 描述 | 示例 |
---|---|---|
'b' | 字节型 | np.dtype('b') |
'i' | 有符号整型 | np.dtype('i4') == np.int32 |
'u' | 无符号整型 | np.dtype('u1') == np.uint8 |
'f' | 浮点型 | np.dtype('f8') == np.int64 |
'c' | 复数浮点型 | np.dtype('c16') == np.complex128 |
'S'或'a' | 字符串 | np.dtype('S5') |
'U' | Unicode编码字符串 | np.dtype('U') == np.str_ |
'V' | 原生数据,raw data(空,void) | np.dtype('V') == np.void |
2.填充值
data['键'] = 列表
示例:
data = np.zeros(4, dtype={'names': ('name', 'age', 'weight'), 'formats': ('U10', 'i4', 'f8')})
name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]
data['name'] = name
data['age'] = age
data['weight'] = weight