ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

numpy数组的拼接(扩维拼接和非扩维拼接)

2021-10-19 09:34:29  阅读:159  来源: 互联网

标签:concatenate 扩维 print 拼接 np array numpy axis


hstack, vstack, dstack, concatenate, stack这些函数都可以用来拼接Numpy数组。还可以利用list来拼接数组。
对于拼接的效果其实我们可以划分为2类:

横向拼接:hstack, vstack, concatenate等。横向拼接的意思是指,拼接不会产生更高的维度。比如两个2x2的二维矩阵拼接以后,它还是一个二维矩阵,只是变胖了,变成4x2或者2x4。
扩维拼接:dstack, stack等。拼接后会产生更高的维度,两个(2, 2)的二维矩阵拼接会产生(2, 2, 2)的三维矩阵。
1. 水平拼接hstack

np.hstack()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.hstack((a, b))
print(c)
print(c.shape)
1
2
3
4
5
6
输出为:

array([[1, 1, 2, 2],
[1, 1, 2, 2]])
(2, 4)
1
2
3
2. 垂直拼接数组vstack

np.vstack()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.vstack((a, b))
print(c)
print(c.shape)
1
2
3
4
5
6
输出为:

array([[1, 1],
[1, 1],
[2, 2],
[2, 2]])
(4, 2)
1
2
3
4
5
3.深度拼接dstack

np.dstack()
1
import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.dstack((a, b))
print(c)
print(c.shape)
1
2
3
4
5
6
输出为:

array([[[1, 5],
[2, 6]],

[[3, 7],
[4, 8]]])
(2, 2, 2)
1
2
3
4
5
6
4.concatenate()函数拼接
concatenate()是非常灵活的拼接函数。

np.concatenate()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.concatenate((a, b), axis=0)
print(c)
print(c.shape)
1
2
3
4
5
6
输出为:

array([[1, 1],
[1, 1],
[2, 2],
[2, 2]])
(4, 2)
1
2
3
4
5
可见axis=0时,concatenate的功能和vstack一样。axis=0的含义就是,在第0个维度扩展,其他维度保持不变。这里的第0个维度之前是2,现在是4。
而axis=1时,输出为:

array([[1, 1, 2, 2],
[1, 1, 2, 2]])
(2, 4)
1
2
3
可见axis=1时,concatenate的功能和hstack一样。
注意,axis的取值只能小于被拼接数组的维度(2),所以axis在这里只能取0和1。
但对于多维数组的拼接,concatenate就十分方便了。

5.利用list来实现扩维拼接
我们先构建一个空list

import numpy as np
ls = []
a = np.array([[1, 1],[1, 1]])
b = np.array([[2, 2],[2, 2]])
ls.append(a)
ls.append(b)
c = np.array(ls)
print(c)
print(c.shape)
1
2
3
4
5
6
7
8
9
输出为:

array([[[1, 1],
[1, 1]],

[[2, 2],
[2, 2]]])
(2, 2, 2)
1
2
3
4
5
6
注意,这一操作和dstack是有不同之处的。这个操作是将两个数组叠放在一起而已。

6. 用stack来拼接数组
我们知道stack是扩维拼接,和concatenate有本质的区别。对于两个(2, 2)的数组用stack拼接,我们的结果一定是个三维的,而concatenate的结果是二维的。
涉及到数组的扩维,我们就可以从维度上来理解stack的操作了,初始为2个shape为(2,2)的矩阵,扩展之后:
如果axis = 0,得出结果的shape应该是(_, 2, 2)。看清楚 下划线没有,这个位置的维度是虚位以待的,如果有n(n>=2)个矩阵来拼接,这个下划线的数值就应该是n;(在本博文的栗子里,n=2)
如果axis=1,结果应该是(2, _, 2),在第1个维度上虚位以待;
如果axis=2,结果应该是(2, 2, _),在第2个维度上虚位以待;

np.stack()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)
1
2
3
4
5
6
输出为:

array([[[1, 1],
[1, 1]],

[[2, 2],
[2, 2]]])
(2, 2, 2)
1
2
3
4
5
6
当axis=0时,np.stack就可以实现list一样功能的扩维拼接。
再来看axis=1:
为了更容易看到效果,把两个数组的值改一下:

import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)
1
2
3
4
5
6
array([[[1, 2],
[5, 6]],

[[3, 4],
[7, 8]]])
(2, 2, 2)
1
2
3
4
5
6
再看当axis=2时,

array([[[1, 5],
[2, 6]],

[[3, 7],
[4, 8]]])
(2, 2, 2)
1
2
3
4
5
6
可见,axis=2时,stack和dstack的效果一样。

标签:concatenate,扩维,print,拼接,np,array,numpy,axis
来源: https://www.cnblogs.com/klausage/p/15423379.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有