Numpy
Numpy
- 功能强大的N维数组对象。
- 精密广播功能函数。
- 集成 C/C+和Fortran 代码的工具。
- 强大的线性代数、傅立叶变换和随机数功能。
- NumPy提供了一个N维数组类型,即ndarray, 它描述了相同类型的“项目”集合。可以使用例如N个整数来索引项目。
- 所有ndarray都是同质的:每个项目占用相同大小的内存块, 并且所有块都以完全相同的方式解释。
- 如何解释数组中的每个项目由单独的数据类型对象指定, 其中一个对象与每个数组相关联。除了基本类型(整数,浮点数 等 )之外, 数据类型对象还可以表示数据结构。
导入Numpy模块
1 | import numpy as np |
初识数组(Arrays)
- numpy数组是一个值网格,所有类型都相同,并由非负整数元组索引。
- 维数是数组的排名; 数组的形状是一个整数元组,给出了每个维度的数组大小。
1 | # 用一个一维列表传入 |
1 | array([1, 3, 5, 7]) |
1 | # 查看类型 |
1 | numpy.ndarray |
1 | # 查看维度 返回的格式(n,m),其中n为行数,m为列数 |
1 | (4,) |
1 | # 查看数组的维度数 |
1 | 1 |
1 | ar1.size |
1 | 4 |
1 | # 索引 |
1 | (1, 5) |
1 | # 修改值 |
1 | array([1, 3, 9, 7]) |
创建数组
创建一维数组
- 用np.array(list) 传入列表
- 用np.arange() 传入数值范围
1 | # 直接用列表传入 |
1 | array([ 1, 5, 9, 13, 17]) |
1 | # 用 arange() 传入一个范围,arange的用法和range一样 |
1 | array([1, 4, 7]) |
创建二维数组
- 用np.array([list1,list2]) 传入一个二维列表,且长度一致
- 用np.arange() .reshape(()) 传入数值范围,用reshpe函数重构,reshape函数内是一个元组格式,元素相乘的结果要等于范围内的个数
- reshape()函数重构时,必须保证各维度数值相乘的结果等于数组中元素的个数
1 | # 直接传入一个二维列表 |
1 | (numpy.ndarray, |
1 | # 用arange传入数据范围后用reshape()重构,指定成?行?列 |
1 | array([[1, 2, 3], |
创建多维数组
- 一般用reshape函数比较简单,因为中括号的嵌套比较复杂。
- shape属性可以查看数组的维度。如:e.shape
- 多维数组如何看待?
- 维度显示是一个元组形式
- 末尾的两位可以简单看成是行数和列数
- 再往前则可以理解成小区块,大区快
- 如果shape的结果是(2,3,4) 表示有2个区块,每个区块中有3行4列的数据
- 如果结果是(2,2,2,3) 表示有2个大区块,每个大区块中有2个小区块,每个小区块中有2行3列数据
1 | # 创建一个3维数组 |
1 | (2, 3, 4) |
1 | # 多维数组 |
1 | ((2, 2, 2, 3), |
数组的转换
- reshape()函数和flatten()函数
- 有重构函数reshpe()可以改变数组的维度,只要保证元组元素乘积等于数组数据的个数
- 多维数组就可以转换成1维数组
- reshape((num1,)) num1=数据个数
- flatten()展开数组变成一维数组
1 | a = np.arange(12).reshape(3, 4) |
1 | array([[ 0, 1, 2, 3], |
1 | # 转换成一维数组 |
1 | array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) |
1 | # 变成其他维度(形状),用reshape()并指定行列数 |
1 | array([[ 0, 1, 2, 3, 4, 5], |
创建等值的矩阵
- np.zeros代表全是0
- np.ones代表全是1
1 | np.zeros(5, dtype=np.int32) |
1 | array([0, 0, 0, 0, 0]) |
1 | np.zeros((2, 5), dtype=np.int32) |
1 | array([[0, 0, 0, 0, 0], |
1 | np.ones(5, dtype=np.float16) |
1 | array([1., 1., 1., 1., 1.], dtype=float16) |
1 | import pandas as pd |
1 | numpy.ndarray |
创建等分数组
1 | # 将1-5分段,有两个端点 |
1 | array([1., 5.], dtype=float32) |
1 | # 将1-5分段,有3个端点 |
1 | array([1., 3., 5.]) |
1 | # 将1-5分段,有36个端点 |
1 | array([1. , 1.8, 2.6, 3.4, 4.2, 5. ]) |
高斯分布(正态分布)
1 | np.random.randn(2,5) # 生成对应形状(shape)的高斯分布 |
1 | array([[-0.62751446, 2.29446202, -0.53109692, -0.07013024, 0.28581247], |
均匀分布
1 | np.random.rand(2, 3) # 生成对应形状(shape)的均匀分布 |
1 | array([[0.24771356, 0.63015361, 0.46175306], |
数组索引
- Numpy提供了几种索引数组的方法。
切片(Slicing)
- 与Python列表类似,可以对numpy数组进行切片。由于数组可能是多维的,因此必须为数组的每个维指定一个切片:
1 | # 切片 |
1 | array([[ 1, 2], |
整数与切片混合索引
- 这样做会产生比原始数组更低级别的数组。
1 | a = np.arange(12).reshape(2, 2, 3) |
1 | array([[[ 0, 1, 2], |
1 | # 整数索引与切片索引混合使用 |
1 | array([[ 0, 1, 2], |
整数数组索引
- 使用切片索引到numpy数组时,生成的数组视图将始终是原始数组的子数组。
- 相反,整数数组索引允许你使用另一个数组中的数据构造任意数组
1 | # 整数组索引 |
1 | array([0, 4, 6]) |
布尔组索引
1 | a = np.arange(12).reshape(4, 3) |
1 | [[ 0 1 2] |
Numpy的数据类型
- 用dtype属性查看数组的数据类型 如:a.dtype
- 用astype()函数指定或改变数组的数据类型
- 数据类型
字符 对应类型 b 布尔型 i (有符号) 整型 u 无符号整型 integer f 浮点型 c 复数浮点型 m timedelta(时间间隔) M datetime(日期时间) O (Python) 对象 S, a (byte-)字符串 U Unicode V 原始数据 (void) - 数值类型
Numpy 的类型 C 的类型 描述 np.int8 int8_t 字节(-128到127) np.int16 int16_t 整数(-32768至32767) np.int32 int32_t 整数(-2147483648至2147483647) np.int64 int64_t 整数(-9223372036854775808至9223372036854775807) np.uint8 uint8_t 无符号整数(0到255) np.uint16 uint16_t 无符号整数(0到65535) np.uint32 uint32_t 无符号整数(0到4294967295) np.uint64 uint64_t 无符号整数(0到18446744073709551615) np.intp intptr_t 用于索引的整数,通常与索引相同 ssize_t np.uintp uintptr_t 整数大到足以容纳指针 np.float32 float np.float64 / np.float_ double 请注意,这与内置python float的精度相匹配。 np.complex64 float complex 复数,由两个32位浮点数(实数和虚数组件)表示 np.complex128 / np.complex_ double complex 请注意,这与内置python 复合体的精度相匹配。
数组运算
数组的广播机制,对数组内的每个数据分别进行运算
维度方向运算
- axis=0,对各列
- axis=1,对各行
两个维度不同的数组不能算数运算
两个行列数都不同的数组不能运算
两个维度相同,行数或列数有其一相同,不同的为1的数组可以运算
- 如a:(3,4) b:(3,4)可以运算
- 如a:(3,4) b:(4,3)不可以运算
- 如a:(3,4) b:(1,4) 行数为1,列数相同,可以运算
- 如a:(3,4) b:(3,1) 行数相同,列数为1,可以运算
运算函数
1 | # 对整个进行某种运算,如求和,求最大,最小,平均等等 |
1 | (78, 12, 1, 6.5) |
1 | # 累加 |
1 | array([ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78]) |
1 | # 中间值 |
1 | 6.5 |
1 | # 对每个数据求sin值 |
1 | array([[ 0.84147098, 0.90929743, 0.14112001, -0.7568025 ], |
按维度方向计算
- a.sum(axis=1) 计算各列
- a.max(axis=0) 计算各行
1 | a = np.arange(1, 13).reshape(3, 4) |
1 | [[ 1 2 3 4] |
数组与数组进行运算
1 | # 同维度的数组各自对应位置进行运算 |
1 | array([[101, 103, 105, 107], |
1 | # 与1行同列数的数组运算 |
1 | array([[101, 103, 105, 107], |
1 | # 数组与数组进行运算. 与1列同行数的数组运算 |
1 | array([[101, 102, 103, 104], |
数组排序和转置
- 排序
- axis=0 按列排序
- axis=1 按行排序
- 数组行列转置
- 简便遍历多维数组 arr.flat表示数组的单元
默认按行排序
- axis=1
1 | ar1 = np.array([[8, 12, 6], [13, 9, 27], [1, 5, 3]]) |
1 | array([[ 6, 8, 12], |
按列排序
1 | ar1 = np.array([[8, 12, 6], [13, 9, 27], [1, 5, 3]]) |
1 | array([[ 1, 5, 3], |
全部排序
- 行和列都排序
1 | np.sort(np.sort(ar1, axis=0), axis=1) |
1 | array([[ 1, 3, 5], |
数组的转置
1 | # 创建一个3行4列的数组 |
1 | array([[ 0, 4, 8], |
数组的遍历
列表解析法
1 | # 因为是多维数组,有、1个for循环解析得到的依然是个二维列表 |
1 | [array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8, 9, 10, 11])] |
For循环法
1 | list1 = [] |
1 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] |
1 | # .flat:表示在数组单元中遍历,这样对多维数组简化了for循环 |
1 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] |
1 | # np.nditer(a) 表示在数组单元中遍历,这样对多维数组简化了for循环 |
1 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] |
限制数组中的值
- np.clip
- 这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min。
1 | a = np.arange(1, 37, 4).reshape(3, 3) |
1 | array([[10, 10, 10], |
数组合并
np.vstack()
- 行堆栈,一行一行的堆叠
- 按水平方向(列顺序)堆叠数组构成一个新的数组
1 | a = np.arange(15).reshape(3, 5) |
1 | array([['0', '1', '2', '3', '4'], |
1 | # 将1个1维数组按竖直方向(行)堆栈 |
1 | array([[0], |
np.hstack()
- 列堆栈,一列一列的堆叠
- 按竖直方向(行顺序)堆叠数组构成一个新的数组
1 | # hstack() 可以将一个二维数组展开 |
1 | array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) |
1 | # 将2个2维数组按水平方向(列)堆栈,相当于在数组右侧增加新的数组 |
1 | array([['0', '1', '2', '3', '4', 'A', 'B', 'C', 'D', 'E'], |
np. dstack()
- 按深度方向堆栈,改变数组的维度.
1 | # 将2个2维数组按深度方向堆栈,变成3块5行2列的数组 |
1 | array([[['0', 'A'], |
数组的分割
- np.split(a,3,0)
等分割1维数组
1 | a = np.arange(10) |
1 | [array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9])] |
等分割2维数组
np.split(ary, indices_or_sections, axis=0)
1 | a = np.arange(1, 21).reshape(4, 5) |
1 | [array([[1, 2, 3, 4, 5]]), |