python数据/矩阵基础操作(基础知识篇)

这篇文章主要记录了numpy相关的数据和矩阵操作。并非是详细的操作指南,而是为了防止忘记的个人记录/笔记/总结,以及模糊知识的个人理解。主要关注数据创建,矩阵的变形和合并,数据维度的改变,数据训练时的有用函数等。

1. 创建数据的方法。

  1. 等距数据创建(start,stop,步长,点的个数)
  • arange:(start,stop)内,规定步长的方式:
    start到stop每步长生成一个数据点。
    numpy.arange(start, stop, step, dtype)
  • linspace:(start,stop)内,规定点的个数的方式:
    从start到stop等间距取num个数。(包括start和stop)
    numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
  1. 随机数创建
  • 随机数创建:
    torch.rand()
  • 服从正态分布的随机数创建:
    • 从给定参数means,std的离散正态分布中抽取随机数
      torch.normal(means, std, out=None)
    • np.random.normal(loc=中心值, scale=标准差, size=表示大小且为一个数)
  1. 创建复数:
    用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。
    >>>complex(1, 2)
    (1 + 2j)

2. 数据轴的增加。

目标:随意增加维度。例如:(5,4) -> (1,5,4) or(5,4,1) or(5,1,4)etc.

  • 创建一个数组,大小为(5,4)
    a = np.arange(1,21).reshape((4,5)) #(4,5)
  • 方法1:添加None
    a[None,:,None,:] #(1,4,1,5)
  • 方法2:添加np.newaxis
    a[np.newaxis,:,np.newaxis,:] #(1,4,1,5)
  • 方法3:unsqueeze
    b = torch.from_numpy(a) #(4,5)
    c = torch.unsqueeze(b,dim=0) #(1,4,5)
    d = torch.unsqueeze(c,dim=2) #(1,4,1,5)
    注意:dim=index,就在index那个位置加上1维,其余顺移。
    如果想要还原,把这些没有意义的1的位置去掉可以使用torch.squeeze()。
    e = torch.squeeze(d) #(4,5)

2.1 数据轴的交换

  • numpy : transpose
  • pytorch :permute
    如何理解transpose的数据轴交换方式?
    在程序中实现为两个步骤:
    • 读取每个元素的坐标,按指定的要求交换元素的坐标位置。比如,对于在(0,1,2)的元素a,如果要求transpose(0,2,1),则其坐标改为(0,2,1)。
    • 依次将各个元素按改过的坐标填入新的矩阵。
x = np.arange(210).reshape([5,6,7]) #(5, 6, 7)
x_trans = x.transpose(2,1,0)    #(7, 6, 5)

y = torch.from_numpy(x) #torch(5,6,7)
y_trans = y.permute(2,1,0)  #torch.Size([7, 6, 5]))

3. 数据的循环调用

  • enumerate:返回各个数据的索引。
    作用于可迭代sequence,返回对象的数据和索引。
    返回的格式为[(索引,数据),(索引,数据),...]
    enumerate(sequence, [start=0])
    https://www.runoob.com/python/python-func-enumerate.html

  • zip:将两串数据一一相关联,例如features和labels。
    用zip打包相关联的列表,并使用for循环调用。

a = [1,2,3]
b = [4,5,6]
c = ['x','y','z']

zipabc = zip(a,b,c)

for ia,ib,ic in zipabc:
    print(ia,ib,ic)

输出结果:
1 4 x
2 5 y
3 6 z

4.数据矩阵形状的改变

  • a.view(x,y)(此处a是tensor):
    可以使用a.view(x,y),将该tensor改为x行y列的(x,y)形式。
    a = torch.arange(1,7).reshape((1,6))
    print(a.view(2,3))

输出结果:
tensor([[1, 2, 3],[4, 5, 6]])

注意:
如果想要改成x行但不知道多少列,可以用-1来代替y的数值。如a.view(2,-1)得到大小为(2,3)。反之亦然,a.view(-1,2)得到大小(2,3)。程序会自行计算数值,如果不能刚好分完,则会报错。

5.数据的shape

  • a.size() #此处a是tensor
    a.size(0)
  • a.shape #此处a是array
    a.shape[0]
  • len(a) # #此处a是list

6. 矩阵合并

我遇到的矩阵合并有几个常用需求,第一种需求是横向纵向拼接。横向拼接比如feature数目的增加;纵向拼接比如样本数量的增加。第二种需求,与其说是两个矩阵的合并,不如说是第二个矩阵加入到第一个矩阵中去。这个需求出现在循环读取文件时,两个矩阵不能同时读取。通常是不断有矩阵加入到“空矩阵”里面。

6.1 两个矩阵横向纵向拼接
  1. np.concatenate( )
    np.concatenate((a,b)) #纵向拼接
    np.concatenate((a,b),axis=0) #纵向拼接
    np.concatenate((a,b),axis=1) #横向拼接
  2. np.stack系列全家桶
    eg.A = [[a,b][c,d]], B = [[j,k],[x,y]]
    np.stack((a,b)) #矩阵整体独立拼接。[[[a,b][c,d]],[[j,k],[x,y]]] =[A,B]
    np.dstack((a,b)) #同上
    np.vstack((a,b)) #vertical;纵向[[a,b],[c,d],[j,k],[x,y]]
    np.hstack((a,b)) #horizontal;横向[[a,b,j,k],[c,d,x,y]]
6.2 矩阵加入

虽然np提供了np.append,但对于在空list中添加矩阵,目前是使用list先操作,再转换为array的方式,毕竟list对长度没有要求,后续可能更新更高效的方法。
np.append的方法感觉和两个矩阵拼接没有区别,方法如下:
np.append(a,b) #a,b中所有元素拼接成一个矩阵
np.append(a,b,axis=0) #纵向
np.append(a,b,axis=1) #横向
以上矩阵合并方法为简单总结描述,具体详细例子可参考这个链接。

6.3 矩阵拆解

torch.chunk(tensor, chunk_num, dim)
将tensor按dim(行或列)分割成chunk_num个tensor块,返回的是一个元组。


2022-02-05 14:29:35 更新矩阵合并方法
2022-02-07 17:05:36 更新矩阵数据轴交换操作
2022-03-22 11:10:30 更新矩阵拆解方法

你可能感兴趣的:(python数据/矩阵基础操作(基础知识篇))