numpy常用命令总结

2022/01/27 数据分析 共 3409 字,约 10 分钟

concatenate

用来对数列或矩阵进行合并

  • 两个一维数组
import numpy as np
a=[1,2,3]
b=[4,5,6]
np.concatenate((a,b),axis=0)

输出为

array([1, 2, 3, 4, 5, 6])

因为上述a和b都是一维的,所以当指定axis=1时,程序就会报错。

  • 两个二维数组
import numpy as np
a=np.array([[1,2,3],[111,222,333]])
b=np.array([[4,5,6],[44,55,67]])
print(a)
print('\n矩阵a的维度为:',a.shape)
print(b)
print("\naxis=0的结果为:\n",np.concatenate((a,b),axis=0)) 
print("\naxis=0的维度为:\n",np.concatenate((a,b),axis=0).shape) 
print("\naxis=1的结果为:\n",np.concatenate((a,b),axis=1)) 
print("\naxis=1的维度为:\n",np.concatenate((a,b),axis=1).shape) 

输出结果为

[[  1   2   3]
 [111 222 333]]

矩阵a的维度为: (2, 3)
[[ 4  5  6]
 [44 55 67]]

axis=0的结果为:
 [[  1   2   3]
 [111 222 333]
 [  4   5   6]
 [ 44  55  67]]

axis=0的维度为:
 (4, 3)

axis=1的结果为:
 [[  1   2   3   4   5   6]
 [111 222 333  44  55  67]]

axis=1的维度为:
 (2, 6)

axis=0 可以看做直接把 b 矩阵接在 a 的下面,即按行进行合并,此时的维度为(4,3),axis=1 可以看做将矩阵连接在 a 的右边,即按列进行合并,此时的维度为(2,6)。

  • 两个三维数组
import numpy as np
a=np.array([[[1,2,3],[111,222,333]],[[134,131,423],[134,6356,754]],[[984,1940,2940],[245,245,546]]])
b=np.array([[[13,13,35],[697,2572,33633]],[[13354,132461,4723],[1374,63856,754]],[[9844,19640,2940],[23645,23645,56346]]])
print(a)
print('\n矩阵a的维度为:',a.shape)
print(b)
print("\naxis=0的结果为:\n",np.concatenate((a,b),axis=0)) #axis=0表示在行上加,axis=1表示在列上加
print("\naxis=0的维度为:\n",np.concatenate((a,b),axis=0).shape) 
print("\naxis=1的结果为:\n",np.concatenate((a,b),axis=1)) #axis=0表示在行上加,axis=1表示在列上加
print("\naxis=1的维度为:\n",np.concatenate((a,b),axis=1).shape) 
print("\naxis=2的结果为:\n",np.concatenate((a,b),axis=2)) #axis=0表示在行上加,axis=1表示在列上加
print("\naxis=2的维度为:\n",np.concatenate((a,b),axis=2).shape) 

a和b是两个三维数组,其维度为(3,2,3),输出的结果如下

[[[   1    2    3]
  [ 111  222  333]]

 [[ 134  131  423]
  [ 134 6356  754]]

 [[ 984 1940 2940]
  [ 245  245  546]]]

矩阵a的维度为: (3, 2, 3)
[[[    13     13     35]
  [   697   2572  33633]]

 [[ 13354 132461   4723]
  [  1374  63856    754]]

 [[  9844  19640   2940]
  [ 23645  23645  56346]]]

axis=0的结果为:
 [[[     1      2      3]
  [   111    222    333]]

 [[   134    131    423]
  [   134   6356    754]]

 [[   984   1940   2940]
  [   245    245    546]]

 [[    13     13     35]
  [   697   2572  33633]]

 [[ 13354 132461   4723]
  [  1374  63856    754]]

 [[  9844  19640   2940]
  [ 23645  23645  56346]]]

axis=0的维度为:
 (6, 2, 3)

axis=1的结果为:
 [[[     1      2      3]
  [   111    222    333]
  [    13     13     35]
  [   697   2572  33633]]

 [[   134    131    423]
  [   134   6356    754]
  [ 13354 132461   4723]
  [  1374  63856    754]]

 [[   984   1940   2940]
  [   245    245    546]
  [  9844  19640   2940]
  [ 23645  23645  56346]]]

axis=1的维度为:
 (3, 4, 3)

axis=2的结果为:
 [[[     1      2      3     13     13     35]
  [   111    222    333    697   2572  33633]]

 [[   134    131    423  13354 132461   4723]
  [   134   6356    754   1374  63856    754]]

 [[   984   1940   2940   9844  19640   2940]
  [   245    245    546  23645  23645  56346]]]

axis=2的维度为:
 (3, 2, 6)

axis=0,则表示合并后第一个维度数据要变(axis是从0开始计算的,即第一维表示0),axis=1,则表示合并后第二个维度的数据要变,axis=2,则表示合并后第三个维度数据要变。数据变换一般是两个数组相同维度数值相加。

与 torch.cat 对比

  1. 字面理解:torch.cat是将两个张量(tensor)拼接在一起,cat是concatenate的意思,即拼接,联系在一起。

  2. 例子理解

>>> import torch
>>> A=torch.ones(2,3) #2x3的张量(矩阵)                                     
>>> A
tensor([[ 1.,  1.,  1.],
        [ 1.,  1.,  1.]])
>>> B=2*torch.ones(4,3)#4x3的张量(矩阵)                                    
>>> B
tensor([[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]])
>>> C=torch.cat((A,B),0)#按维数0(行)拼接
>>> C
tensor([[ 1.,  1.,  1.],
         [ 1.,  1.,  1.],
         [ 2.,  2.,  2.],
         [ 2.,  2.,  2.],
         [ 2.,  2.,  2.],
         [ 2.,  2.,  2.]])
>>> C.size()
torch.Size([6, 3])
>>> D=2*torch.ones(2,4) #2x4的张量(矩阵)
>>> C=torch.cat((A,D),1)#按维数1(列)拼接
>>> C
tensor([[ 1.,  1.,  1.,  2.,  2.,  2.,  2.],
        [ 1.,  1.,  1.,  2.,  2.,  2.,  2.]])
>>> C.size()
torch.Size([2, 7])

上面给出了两个张量A和B,分别是2行3列,4行3列。即他们都是2维张量。因为只有两维,这样在用torch.cat拼接的时候就有两种拼接方式:按行拼接和按列拼接。即所谓的维数0和维数1.

C=torch.cat((A,B),0)就表示按维数0(行)拼接A和B,也就是竖着拼接,A上B下。此时需要注意:列数必须一致,即维数1数值要相同,这里都是3列,方能列对齐。拼接后的C的第0维是两个维数0数值和,即2+4=6.

C=torch.cat((A,B),1)就表示按维数1(列)拼接A和B,也就是横着拼接,A左B右。此时需要注意:行数必须一致,即维数0数值要相同,这里都是2行,方能行对齐。拼接后的C的第1维是两个维数1数值和,即3+4=7.

从2维例子可以看出,使用torch.cat((A,B),dim)时,除拼接维数dim数值可不同外其余维数数值需相同,方能对齐。

参考链接

文档信息

Search

    Table of Contents