一、Numpy创建数组
1.1 将列表转换为数组
import numpy as np
list1 = [[2, 5, 3.2], [0, 4.2, 5]]
nd1 = np.array(list1)
print(nd1)
'''
[[2. 5. 3.2]
[0. 4.2 5. ]]
'''
1.2 获取随机数(random模块)
函数 | 代码 | 含义 |
---|
random:0~1之间的随机数 | np.random.random() | |
| np.random.random() | 生成一个0~1之间的随机数 |
| np.random.random(2) | 生成两个0到1之间的随机数 |
| np.random.random((2, 2)) | 生成形状为(2, 2)的0到1之间的随机数 |
rand:0~1之间均匀分布的随机数 | np.random.rand() | |
| np.random.rand(2) | 生成两个服从0-1均匀分布的随机数 |
| np.random.rand(2, 3) | 生成形状为(2,3)的服从0-1均匀分布的随机数 |
| np.random.rand(2, 3, 4) | 生成形状为(2,3,4)的服从0-1均匀分布的随机数 |
uniform:某区间均匀分布的随机小数 | np.random.uniform() | |
| np.random.uniform(2, 5) | 生成一个均匀分布在[2,5)区间的随机数 |
| np.random.uniform(10, 50, 3) | 生成三个均匀分布在[10,50)区间的随机数 |
| np.random.uniform(0, 10, (2, 3)) | 生成三个均匀分布在[10,50)区间的随机数 |
randn:标准正态的随机小数 | np.random.randn() | |
| np.random.randn() | 生成一个标准正态的随机数 |
| np.random.randn(3) | 生成三个标准正态的随机数 |
| np.random.randn(2, 3) | 生成形状为且(2,3)的标准正态的随机数 |
randint:随机生成整数 | np.random.randint() | |
| np.random.randint(2, 5) | 随机生成一个[2,5)区间的整数 |
| np.random.randint(0, 10, 5) | 随机生成5个[0,10)区间的整数 |
| np.random.randint(10, 50, (2, 3)) | 随机生成形状为(2,3)的数值在[10,50)区间的整数 |
normal:生成正态分布 | np.random.normal() | |
| np.random.normal(10, 1) | 随机生成1个正态分布为(10,1)的随机数 |
| np.random.normal(5, 10, 3) | 随机生成3个正态分布为(5,10)的随机数 |
| np.random.normal(82, 20, (2, 3)) | 随机生成形状为(2,3)的正态分布为(82,20)的随机数 |
random_sample:随机的浮点数 | np.random.random_sample() | |
| np.random.random_sample() | 随机生成1个浮点数 |
| np.random.random_sample(3) | 随机生成3个浮点数 |
| np.random.random_sample((3, 3)) | 随机生成形状为(3,3)的浮点数 |
1.2.1 随机打乱数组顺序(shuffle)
nd = np.random.randint(0,10,(5,5))
print(nd)
'''
[[9 3 6 5 1]
[4 2 5 7 8]
[5 9 1 7 7]
[1 1 5 9 3]
[7 0 1 4 8]]
'''
np.random.shuffle(nd)
print(nd)
'''
[[1 1 5 9 3]
[4 2 5 7 8]
[9 3 6 5 1]
[5 9 1 7 7]
[7 0 1 4 8]]
'''
1.2.2设置随机数种子(seed、RandomState)
设置种子是为了保证每次生成的数一样
rng = np.random.RandomState(42)
ser = pd.Series(rng.randint(0,10,4))
设置随机数种子,100为参数,参数任意取,参数不同,所获得的随机数不同。由于有种子的存在,每次生成5个[0,10)区间的整数相同
np.random.seed(100)
nd = np.random.randint(0, 10, 5)
print("种子为100时随机数的结果为:",nd)
'''
种子为100时随机数的结果为: [8 8 3 7 7]
'''
1.3 按指定形状创建多维数组
函数 | 代码 | 含义 |
---|
zeros:创建全为0的数组 | np.zeros() | |
| np.zeros(2) | 创建全为0的且含两个元素的一维数组 |
| np.zeros((2,3)) | 创建全为0的且形状为(2,3)的二维数组 |
| np.zeros((2,3,4),dtype=int) | 创建全为0的且形状为(2,3,4)的三维数组,int类型 |
ones:创建全为1的数组 | np.ones() | |
| np.ones(2) | 创建全为1的且含两个元素的一维数组 |
| np.ones((2,3)) | 创建全为1的且形状为(2,3)的二维数组 |
| np.ones((2,3,4)) | 创建全为1的且形状为(2,3,4)的三维数组 |
empty:创建空数组,空数据不为0,而是未初始化 | np.empty() | |
| np.empty(2) | 创建全为空的且含两个元素的一维数组 |
| np.empty((2,3)) | 创建全为空的且形状为(2,3)的二维数组 |
| np.empty((2,3,4)) | 创建全为空的且形状为(2,3,4)的三维数组 |
zeros_like:创建与某数组相同形状且全为0的数组 | np.zeros_like() | |
| np.zeros_like(nd1) | 创建与nd1维度形状相同且元素全为0的数组 |
ones_like:创建与某数组相同形状且全为1的数组 | np.ones_like() | |
| np.ones_like(nd1) | 创建与nd1维度形状相同且元素全为1的数组 |
empty_like:创建与某数组相同形状且为空的空数组(未初始化) | np.empty_like() | |
| np.empty_like(nd1) | 创建与nd1维度形状相同且全为空的数组 |
eye:创建左上到右下对角线为1,其他为0的数组 | np.eye() | |
| np.eye(5) | 创建5*5的单位矩阵,左上角到有右下角的对角线全为1,其他为0 |
full:将某值填充某数组 | np.full() | |
| np.full((3,5),666) | 创建形状为(3,5)且元素全为666的数组 |
diag:创建对角线为某值其他为0的数组 | np.diag() | |
| np.diag((1,2,3)) | 创建左上到右下对角线为1,2,3其他为0的矩阵 |
linspace:创建某范围内的等差数列 | np.linspace() | |
| np.linspace(0,5,11) | 创建从0到5元素为11个的等差数列 |
logspace:创建某范围内的等比数列 | np.logspace() | |
| np.logspace(0,2,10) | 创建从10º到10²元素为10个的等比数列 |
| np.logspace(1,3,10) | 创建从10¹到10³元素为10个的等比数列 |
arange | np.arange() | |
| np.arange(10) | 从[0,10)的整数 |
| np.arange(5, 11) | 从[5,11)的整数 |
| np.arange(3, 12, 2) | 从[3,12)且间隔为2的整数 |
| np.arange(2, 13, 3) | 从[2,13)且间隔为3的整数 |
二、Numpy数组运算
2.1 算术运算
a = np.array([1,2,3,4,5])
b = np.array([0,1,2,3,4])
nd为一个数或一维或多维数组数组,a、b为两数组
代码 | 含义 |
---|
1.0/a | 数组除法,倒数 |
b/a | 除法 |
a+b | 加 |
a-b | 减 |
a*b | 乘 |
2**a | 次方 a**2 |
b//a | 整除 |
-a | 取负 |
b%a | 取余 |
nd.min() | 最小值 |
nd.min(axis=0) | 二维中每列最小 |
nd.min(axis=1) | 二维中每行最小 |
np.min(nd) | 最小值 |
np.max(nd) | 最大值 |
np.maximum(nd, 5) | 与5相比返回最大值,如果nd为数组则小于5的用5填充 |
np.sqrt(nd) | 开方 |
np.power(nd,2) | 指数 |
np.sin(nd) | 三角函数 nd = np.linscape(0,np.pi,3) |
np.cos(nd) | 三角函数 |
np.abs(nd) | 绝对值 absolute(nd) 复数取绝对值则为模长 |
np.exp(nd) | 指数函数,打印e的nd次方,e是一个常数为2.71828 |
np.sum(nd) | 求和 |
np.mean(nd) | 计算平均值 nd.mean(0) (1) 多维数据不同维度均值 |
np.median(nd) | 中位数 |
np.std(nd) | 标准差 |
np.var(nd) | 方差 |
np.log(nd) | 底为e的对数,nd不能为0 |
np.log2(nd) | 底为2的对数,nd不能为0 |
np.multiply(nd, nd) | 对应元素相乘,也可乘常数,如np.multiply(nd, 2)即nd1*2,nd1/2 |
np.add(nd, nd) | 相加 |
np.subtract(nd, nd) | 相减 |
np.divide(nd, nd) | 相除 |
np.negative(nd) | 负数 |
np.floor_dicide(nd,nd) | 整除 |
np.mod(nd,nd) | 取模 |
np.dot(nd, nd) | 内积,矩阵相乘,nd为多维数组 |
np.add.reduce(a) | 各元素和 |
np.add.accumulate(a) | 计算中间结果 [1,3,6,10,15] 乘法类似 |
np.multiply.reduce(a) | 各元素乘积 |
np.multiply.outer(a,a) | 外积(矩阵相乘) |
2.2 比较 获取符合值 统计 逻辑运算
a = np.array([1,2,3,4,5,6])
代码 | 含义 | 结果 |
---|
a>3 | 大于 | [False False False True True True] |
a==3 | 等于 | [False False True False False False] |
np.equal(a,3) | 等于 | [False False True False False False] |
np.not_equal(a,3) | 不等于 | [ True True False True True True] |
np.less(a,3) | 小于 | [ True True False False False False] |
np.less_equal(a, 3) | 小于等于 | [ True True True False False False] |
np.greater(a, 3) | 大于 | [False False False True True True] |
np.greater_equal(a, 3) | 大于等于 | [False False True True True True] |
a = np.array([[1,3,6],[3,1,5]])
代码 | 含义 | 结果 |
---|
a[a<3] | 小于3的所有值 | [1 1] |
np.count_nonzero(a<3) | a中小于3的个数 | 2 |
np.sum(a<3) | a中小于3的个数 false被解释为0 True为1 | 2 |
np.sum(a<3,axis=1) | 每行小于3的个数 | [1 1] |
np.any(a>3) | 判断a有没有大于3的,返回False True | True |
np.all(a<5) | a中所有值是否都小于5 | False |
np.bitwise_and(a>2,a<4) | & | |
np.bitwise_or(a<2,a>4) | 或 | |
np.bitwise_xor() | ^ | |
np.bitwise_not() | ~ | |
np.sum((a>2)&(a<4)) | 2到4之间的个数 | |
np.sum((a<2) | (a>4)) | 小于2或大于4的个数 |
np.sum(~((a<2) | (a>4))) | 非 |
2.3 广播
将不同维度的数据扩充为相同维度
如[5]扩充为[5,5,5],[0,1,2]扩充为[[0,1,2],[0,1,2],[0,1,2]],[[0],[1],[2]]扩充为[[0,0,0],[1,1,1],[2,2,2]]等
import numpy as np
a = np.array([0,1,2])
b = np.array([[1,1,1],[1,1,1],[1,1,1]])
c = np.array([[0],[1],[2]])
print(a+5)
print(b+a)
print(c+a)
三、Numpy数组操作
3.1 属性
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
代码 | 含义 |
---|
a.ndim | 维度 |
a.shape | 每个维度大小 |
a.size | 总大小 |
a.dtype | 数据类型 |
a.itemsize | 每个元素字节大小 |
a.nbytes | 数组总字节大小 |
3.2 选择(choice)
a = np.arange(1, 25)
代码 | 含义 |
---|
np.random.choice(a, size=(3, 4)) | 从a中随机取出12个数字(形状为3*4),可重复获取 |
np.random.choice(a, size=(3, 4),replace=True) | 从a中随机取出12个数字(形状为3*4),可重复获取 |
np.random.choice(a, size=(3, 4),replace=False) | 从a中随机取出12个数字(形状为3*4),不可重复获取 |
3.3 索引切片
| 代码 | 含义 |
---|
一维索引 | nd = np.random.randint(0, 10, 10) | 创建10个在[0,10)之间的随机数 |
| nd[1] | 获取第二个数字 |
| nd[-1] | 获取倒数第一个数字 |
| nd[2:8] | 获取第三至第八个数字 |
| nd[:5] | 获取第一至第五个数字 |
| nd[3:] | 获取第四至最后一个数字 |
| nd[1:8:2] | 获取第二至第八且间距为2的数字 |
| nd[::2] | 获取所有数据且间距为二 |
二维索引 | nd = np.random.randint(0, 10, (5, 5)) | 创建形状为(5,5)且元素在[0,10)之间的随机数 |
| nd[(nd>3)&(nd<8)] | 获取大于3小于8的数 |
| nd[3][2] | 获取第四行第三个 |
| nd[3, 2] | 同上 |
| nd[1] | 获取第二行 |
| nd[1:4] | 获取二至四行 |
| nd[1:4:2] | 获取二至四行且间隔为2,即第二、第四行 |
| nd[:, 1] | 获取第二列 |
| nd[:, 1:4] | 获取二至四列 |
| nd[:, 1:4:2] | 获取二至四列且间隔为2,即第二、第四列 |
| nd[1:3, 2:4] | 获取二至三行且三至四列 |
3.3.1 花哨索引
a = np.array([1,2,3,4,5,6])
print([a[1],a[3]])
print(a[[3,2,1]])
b = np.array([[1,3],[2,4]])
print(a[b])
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([0,1,2])
c = np.array([2,0,1])
print(a[b,c])
print(a[b[:,np.newaxis],c])
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[2,[2,0,1]])
print(a[1:,[2,0,1]])
row = np.array([0,1,2])
c= np.array([1,0,1],dtype=bool)
print(a[row[:,np.newaxis],c])
3.4 数据的保存与读取
代码 | 含义 |
---|
np.savetxt(X=nd1, fname=‘./test1.txt’) | 保存数据,文件名为test1.txt |
nd2 = np.loadtxt(‘./test1.txt’) | 读取数据 |
3.5 数组合并与拆解
| 代码 | 含义 | |
---|
append :合并 | np.append(nd1,nd2) | 将nd1和nd2合并为一维,nd1在前,nd2在后 | 一维或多维 |
| np.append(nd1,nd2,axis=0) | 默认axis=0为nd2加在nd1下方,axis=1为nd2加在nd1右方 | |
concatenate :合并 | np.concatenate((nd1,nd2)) | nd1在前,nd2在后 | 一维 |
| np.concatenate((nd1,nd2)) | nd2加在nd1下方 | 二维 |
| np.concatenate((nd1,nd2),axis=0) | 默认axis=0为nd2加在nd1下方,axis=1为nd2加在nd1右方 | 二维 |
stack :合并 | np.stack((nd1,nd2),axis=2) | nd1,nd2都为二维(4,3),默认时axis=0合并后为三维(2,4,3)axis=1时为三维(4,2,3)axis=2时为三维(4,3,2) | |
| np.hstack((nd1, nd2)) | 行合并 | 一维或多维 |
| np.vstack((nd1, nd2)) | 列合并 | 一维或多维 |
| np.dstack((nd1, nd2)) | nd1,nd2都为二维(4,3),默认时axis=0合并后为三维(4,3,2) | |
split :分割 | np.split(a,(3,5)) | 3 5为索引 | 一维或多维 |
| np.vsplit(nd1, 4) | 横向拆分4份 | 多维 |
| np.vsplit(a,[1,2,3]) | 横向按索引号1,2,3分割 | 多维 |
| np.hsplit(nd1, 3) | 列向拆分为3份 | 一维或多维 |
| np.hsplit(a,[1,2,3]) | 列向拆分为3份 | 一维或多维 |
3.6 数组变形
代码 | 含义 |
---|
nd.reshape(2, 8) | 将nd转化为2*8(nd转化前后元素个数相同),nd没发生变化 |
nd.reshape(-1, 2) | 将nd转化为两列,2一定要能被nd元素个数整除 |
nd.reshape(2, -2) | 将nd转化为两行,2一定要能被nd元素个数整除 |
nd[np.newaxis,:] | 通过newaxis获取的行向量 |
nd[:,np.newaxis] | 通过newaxis获取的列向量 |
nd.resize(2, 8) | 将nd转化为2*8,且nd发生变化 |
nd.T | 转置,34变为43,nd没发生变化 |
nd.ravel(‘F’) | 按列展开成一维 |
nd.ravel() | 按行展开成一维 |
nd.flatten() | 将多维转一维 |
nd.squeeze | 降维,把矩阵中含1的维度去掉,如shape为(3,1)或(3,1,2,1),则降维后为(3,)或(3,2) |
nd.transpose(1, 0).shape | 如果nd为3维且nd.shape为(2,3,4),则nd.transpose(1,2,0).shape为(3,4,2),进行维度切换 |