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 对比
字面理解:torch.cat是将两个张量(tensor)拼接在一起,cat是concatenate的意思,即拼接,联系在一起。
例子理解
>>> 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数值可不同外其余维数数值需相同,方能对齐。
参考链接
文档信息
- 本文作者:ironartisan
- 本文链接:https://ironartisan.github.io/2022/01/27/numpy-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)