1. 数组的构造
通过array构造
np.array([1, 2, 3])
等差序列np.linspace()或np.arrange()
np.linspace,取头和尾,中间均匀取点
np.linspace(start=0, stop=8, num=5) # 起始、终止(包含)、样本个数
#输出:array([0., 2., 4., 6., 8.])
x=np.linspace(6,18,7)
#输出:[ 6. 7.71428571 9.42857143 11.14285714 12.85714286 14.57142857
16.28571429 18. ]
np.arange()
np.arange(start=0, stop=8.1, step=2) # 起始、终止(不包含)、步长(不写的话默认是1)
#输出:array([0., 2., 4., 6., 8.])
import numpy as np
import torch
x=np.arange(6,18,3)
y=torch.arange(6,18,3)
z=type(x)
s=type(y)
print(x)
print(y)
print(z)
print(s)
zeros(0矩阵),eye(单位矩阵),full(批量填充)
#np.zeros()和np.ones同理,如果传其他的数字的话,可以用np.full
x=np.zeros((3,4),int)#(3,4)是输出的维度,int代表输出的类型
y=np.full((3,5),10)#代表填充全为10的3*5的矩阵
np.eye(3)
#输出一个3*3的单位矩阵
np.eye(3, k=-1) # 偏移主对角线1个单位的伪单位矩阵,K=1表示向上偏移,-1表示向下偏移
随机矩阵:np.random
rand:0-1随机均匀分布
np.random.rand(3) # 生成服从0-1均匀分布的三个随机数
np.random.rand(3, 3) # 注意这里传入的不是元组,每个维度大小分开输入
服从区间a到b上的均匀分布
np.random.uniform(5, 15, 3)#生成三个5-15的均匀分布的数
array([ 5.63812531, 5.95920446, 13.87864676])
randn:N(0,I)的标准正态分布
np.random.randn(3)
np.random.randn(2, 2)
normal:生成方差为 𝜎2 均值为 𝜇 的一元正态分布
np.random.normal(3, 2.5, 3)#均值为3,方差为2.5的三个数
randint:指定生成随机整数的最小值最大值(不包含)
np.random.randint(low, high, size)#比如np.random.randint(3,6,(3,4))
choice
可以从给定的列表中,以一定概率和方式抽取结果,当不指定概率时为均匀采样,默认抽取方式为有放回抽样
my_list = ['a', 'b', 'c', 'd']
# replace:True表示有放回抽样,False表示不放回抽样,默认为True
np.random.choice(my_list, 2, replace=False, p=[0.1, 0.7, 0.1 ,0.1])
#输出:array(['b', 'd'], dtype='<U1')
np.random.choice(my_list, (5,5), p=[0.1, 0.7, 0.1 ,0.1])#抽5*5个
permutation函数
当返回的元素个数与原列表相同时,不放回抽样等价于使用permutation函数,即打散原列表
my_list = ['a', 'b', 'c', 'd']
np.random.permutation(my_list)
#输出:array(['c', 'd', 'a', 'b'], dtype='<U1')
随机种子
它能够固定随机数的输出结果
np.random.seed(0)
np.random.rand()
import numpy as np
import torch
np.random.seed(3)
x=np.random.randint(3,9,3)
print(x)
#如果第一次运行为[3,8,3],那么不管运行多少次,这个随机数都一直是[3,8,3]
2. np数组的变形与合并
转置:.T
np.zeros((2,3)).T#相当于把矩阵转置
合并操作:r_, c_
对于二维数组而言,r_和c_分别表示上下合并和左右合并,上下合并要求列数相同,左右合并要求行数相同
np.r_[np.zeros((2, 3)),np.ones((1, 3))]
# 左右合并
np.c_[np.zeros((2,3)),np.ones((2,4))]
# 一维数组和二维数组合并时,将一维数组看做列向量,只能够使用左右合并 np.c_[np.zeros(2),np.ones((2,4))]
3. np数组的切片与索引
数组的切片模式支持使用slice类型的start:end:step切片,还可以直接传入列表指定某个维度的索引进行切片
一维数组
target = np.arange(0, 9) # 左闭右开 target
#输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8])
target[-1]# 取最后一个元素 ,输出8
# 取从第2个元素到倒数第一个元素(从0开始,左闭右开,最后一个不取)
target[2:-1]
#输出:array([2, 3, 4, 5, 6, 7])
# 取从后向前(相反)的元素
target[::-1]
#输出:array([8, 7, 6, 5, 4, 3, 2, 1, 0])
# 取偶数位的元素
target[::2]
#输出:array([0, 2, 4, 6, 8])
# 取奇数位的元素
target[1::2]
#输出:array([1,3,5,7])
二维数组
target = np.arange(9).reshape(3,3)
target
#取第0维第0个到最后一个(左闭右开,最后一个不取),取第一维的第0个和第2个
target[:-1, [0,2]]
np.ix
还可以利用np.ix_在对应的维度上使用布尔索引,但此时不能使用slice切片
# 对于第0维选择第0个和第2个,第1维选择第1个和第2个
target[np.ix_([True, False, True], [False, True, True])]
#当数组维度为1维时,可以直接进行布尔索引,而无需np.ix_
new = target.reshape(-1)
new
#输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8])
new%2==0
#输出:array([ True, False, True, False, True, False, True, False, True])
new[new%2==0]
#输出:array([0, 2, 4, 6, 8])