Python数据处理之Numpy库

一、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)    #将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个的等比数列
arangenp.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为12
np.sum(a<3,axis=1)每行小于3的个数[1 1]
np.any(a>3)判断a有没有大于3的,返回False TrueTrue
np.all(a<5)a中所有值是否都小于5False
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)  # [5 6 7]   5广播为[5,5,5],相当于[0,1,2]+[5,5,5]
print(b+a)  # [[1 2 3] [1 2 3] [1 2 3]]   相当于a广播为[[0,1,2],[0,1,2],[0,1,2]]  两个相加
print(c+a)  # [[0 1 2] [1 2 3] [2 3 4]]   a为[[0,1,2],[0,1,2][,0,1,2]] b为[[0,0,0],[1,1,1],[2,2,2]]

三、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)   #获取排序为1到24数字
代码含义
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]]) #[2, 4]
print(a[[3,2,1]])  #[4 3 2]
b = np.array([[1,3],[2,4]])
print(a[b])        #[[2 4] [3 5]]

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])      #[3 4 8]   2,0  1,0  2,1位置的值
# 遵循广播
print(a[b[:,np.newaxis],c])  #[[3 1 2] [6 4 5] [9 7 8]]

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[2,[2,0,1]])   # [9 7 8]
print(a[1:,[2,0,1]])  # [[6 4 5] [9 7 8]]
row = np.array([0,1,2])
c= np.array([1,0,1],dtype=bool)
print(a[row[:,np.newaxis],c])  # [[1 3] [4 6] [7 9]]  获取0 2列

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),进行维度切换
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值