lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
np_stack()concatenate()hstack(),vstack()
2018-10-29 16:24:05
226
0
0
lee-romantic
(一)stack() `stack()`实际上就是`堆叠,拼接`的意思,`针对单个ndarray(torch.cat()函数也是拼接的意思,但是针对的两个tensor),`它所做的工作就是将原来的元素,按照axis的值,取出来打包,重新堆叠形成新的ndarray,可以看下面的例子: 当执行np.stack(arrays, axis=0)时,取出第一维的1、2、3、4,打包,[1, 2, 3, 4],其余的类似,然后结果如下: ``` >>> arrays = [[1,2,3,4], [5,6,7,8]] >>> arrays=np.array(arrays) >>> np.stack(arrays,axis=0) array([[1, 2, 3, 4], [5, 6, 7, 8]]) ``` 当执行np.stack(arrays, axis=1)时,先对arrays中的第二维进行“打包”,也即是将1、5打包成[1, 5],其余的类似,结果如下: ``` >>> np.stack(arrays, axis=1) array([[1, 5], [2, 6], [3, 7], [4, 8]]) ``` 有这个“打包”的概念后,对于三维,或者更高维的数组堆叠也不难理解了. 理解stack的**要点**:`(1)stack前后,对于堆叠的各部分来说,轴的数量相应的增加(2)特定axis轴上,索引相同的数据,打包在一起`,`因此在新增的特定轴上的索引数量(针对于原来stack()内的各个部分的维度来说的),也会相应的增加,如下` ``` >>> a = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) >>> b = np.array([[4, 5, 6], [4, 5, 6], [4, 5, 6]]) >>> a.shape (3, 3) >>> b.shape (3, 3) >>> np.stack((a, b), axis=0).shape #这是针对两个ndarray的情况,实际上与单个ndarray情况是一致的,单个ndarray也可以堪 (2, 3, 3) >>> np.stack((a, b), axis=1).shape (3, 2, 3) >>> np.stack((a, b), axis=2).shape (3, 3, 2) ``` 参看:https://blog.csdn.net/qq_17550379/article/details/78934529 (二)**concatenate()** `concatenate()`意思是`拼接`,针对两个数组,而`hstack()`和`vstack()`则可以理解为`按列拼接(即axis=1)`和`按行拼接(即axis=0)`, `按什么拼接,什么要改变,按axis =1拼接,则axis上维度的索引数量将改变` ``` >>> a = np.array((1,2,3)) >>> b = np.array((2,3,4)) >>> np.hstack((a,b)) array([1, 2, 3, 2, 3, 4]) >>> a = np.array([1, 2, 3])#对于这样的一维的数组,实际上是当成2维来做的,shape是(1,n),所以相当于维度还是没提升#这种情况和stack()的效果一样了 >>> b = np.array([2, 3, 4]) >>> np.vstack((a,b)) array([[1, 2, 3], [2, 3, 4]]) ``` ``` >>> a = np.array([[1],[2],[3]]) >>> b = np.array([[2],[3],[4]]) >>> np.hstack((a,b)) array([[1, 2], [2, 3], [3, 4]]) a = np.array([[1],[2],[3]]) b = np.array([[2],[3],[4]]) np.stack((a,b),axis =1) array([[[1], [2]], [[2], [3]], [[3], [4]]]) >>> a = np.array([[1], [2], [3]]) >>> b = np.array([[2], [3], [4]]) >>> np.vstack((a,b)) array([[1], [2], [3], [2], [3], [4]]) a = np.array([[1], [2], [3]]) b = np.array([[2], [3], [4]]) np.stack((a,b),axis =0) array([[[1], [2], [3]], [[2], [3], [4]]]) ``` 关于np.stack()和np.hstack()之间的区别,可以再通过下面的例子去体会: ``` arr1 = np.array([[1, 2], [3, 4], [5, 6]]) arr2 = np.array([[7, 8], [9, 0], [0, 1]]) res = np.stack((arr1, arr2),axis =1) print(res) #会增加一个维度 [[[1 2] [7 8]] [[3 4] [9 0]] [[5 6] [0 1]]] arr1 = np.array([[1, 2], [3, 4], [5, 6]]) arr2 = np.array([[7, 8], [9, 0], [0, 1]]) res = np.hstack((arr1, arr2)) print(res) [[1 2 7 8] [3 4 9 0] [5 6 0 1]] ``` 下面是一个使用hstack和vstack拼接图片的例子: ``` #image1,image2是ndarray类型的数组 def function(image1,image2): h1,w1,c1 = image1.shape h2,w2,c2 = image2.shape if c1 != c2: print("channels NOT match, cannot merge") return else: if w1 > w2: tmp = np.zeros([h2,w1-w2,c1]) image3 = np.hstack([image2,tmp]) image3 = np.vstack([image1,image3]) elif w1 == w2: image3 = np.hstack([image1,image2]) #横着拼 else: tmp = np.zeros([h1,w2-w1,c2]) image3 = np.hstack([image1,tmp]) image3 = np.vstack([image3,image2]) return image3 #https://ask.csdn.net/questions/714745 ``` 参考: https://blog.csdn.net/csdn15698845876/article/details/73380803?utm_source=blogxgwz0 个人觉得下面这一篇写得更好(上面的笔记,更详细可以参考这篇): https://blog.csdn.net/qq_26414307/article/details/79317965
上一篇:
python导入自建模块的问题
下一篇:
图像处理编程题
0
赞
226 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册