ICode9

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

vstack和hstack以及concatenate处理三维图片

2021-08-07 19:00:40  阅读:256  来源: 互联网

标签:concatenate 3333 hstack 55 666 66666 vstack array 222


Vstack/Hstack和Concatenate在三维图片中的应用,以及维度的认识

先写总结:采用 concatenate可以实现vstack和 hstack的效果。

1.填坑背景:

存在 hstack 和 vstack认知误差, 对人脸补全案例中的图片切割以及合并存在补全失误的情况。

在用机器学习做人脸预测的时候,我们要放入的是二维数组,训练的时候的表格都是二维的。但是我们拿到的face数据是这样的

2. 完整代码

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
np.arange( 1,7 )
array([1, 2, 3, 4, 5, 6])
arr = np.array( [
        [ 1, 2, 3, 4, 5, 6] ,  

        [ 11, 22, 33, 44, 55, 66] ,  

        [ 111, 222, 333, 444, 555, 666] ,  

        [ 1111, 2222, 3333, 4444, 5555, 6666] ,  

        [ 11111, 22222, 33333, 44444, 55555, 66666] , 

        [ 111111, 222222, 333333, 444444, 555555, 666666] ,  
    ]
        )
arr
array([[     1,      2,      3,      4,      5,      6],
       [    11,     22,     33,     44,     55,     66],
       [   111,    222,    333,    444,    555,    666],
       [  1111,   2222,   3333,   4444,   5555,   6666],
       [ 11111,  22222,  33333,  44444,  55555,  66666],
       [111111, 222222, 333333, 444444, 555555, 666666]])
arr.shape
(6, 6)
arr03 = arr[:,0:3]
arr03
array([[     1,      2,      3],
       [    11,     22,     33],
       [   111,    222,    333],
       [  1111,   2222,   3333],
       [ 11111,  22222,  33333],
       [111111, 222222, 333333]])
arr04 = arr[:,3:6]
arr04
array([[     4,      5,      6],
       [    44,     55,     66],
       [   444,    555,    666],
       [  4444,   5555,   6666],
       [ 44444,  55555,  66666],
       [444444, 555555, 666666]])

水平拼接

np.hstack( (arr03, arr04 ))
array([[     1,      2,      3,      4,      5,      6],
       [    11,     22,     33,     44,     55,     66],
       [   111,    222,    333,    444,    555,    666],
       [  1111,   2222,   3333,   4444,   5555,   6666],
       [ 11111,  22222,  33333,  44444,  55555,  66666],
       [111111, 222222, 333333, 444444, 555555, 666666]])

垂直拼接

np.vstack( (arr03, arr04) )
array([[     1,      2,      3],
       [    11,     22,     33],
       [   111,    222,    333],
       [  1111,   2222,   3333],
       [ 11111,  22222,  33333],
       [111111, 222222, 333333],
       [     4,      5,      6],
       [    44,     55,     66],
       [   444,    555,    666],
       [  4444,   5555,   6666],
       [ 44444,  55555,  66666],
       [444444, 555555, 666666]])
# vstack 表示垂直拼接,属于1, hstack 属于水平拼接,表示0
np.concatenate(  ( arr03, arr04 ) , axis = 0 )
array([[     1,      2,      3],
       [    11,     22,     33],
       [   111,    222,    333],
       [  1111,   2222,   3333],
       [ 11111,  22222,  33333],
       [111111, 222222, 333333],
       [     4,      5,      6],
       [    44,     55,     66],
       [   444,    555,    666],
       [  4444,   5555,   6666],
       [ 44444,  55555,  66666],
       [444444, 555555, 666666]])
np.concatenate(  ( arr03, arr04 ) , axis = 1 ) 
array([[     1,      2,      3,      4,      5,      6],
       [    11,     22,     33,     44,     55,     66],
       [   111,    222,    333,    444,    555,    666],
       [  1111,   2222,   3333,   4444,   5555,   6666],
       [ 11111,  22222,  33333,  44444,  55555,  66666],
       [111111, 222222, 333333, 444444, 555555, 666666]])

2.1 高维数组拼接

用于图像处理

brr = np.array( [[
        [ 1, 2, 3, 4, 5, 6] ,  

        [ 11, 22, 33, 44, 55, 66] ,  

        [ 111, 222, 333, 444, 555, 666] ,  

        [ 1111, 2222, 3333, 4444, 5555, 6666] ,  

        [ 11111, 22222, 33333, 44444, 55555, 66666] , 

        [ 111111, 222222, 333333, 444444, 555555, 666666] ,  
    ]]
        )
brr
array([[[     1,      2,      3,      4,      5,      6],
        [    11,     22,     33,     44,     55,     66],
        [   111,    222,    333,    444,    555,    666],
        [  1111,   2222,   3333,   4444,   5555,   6666],
        [ 11111,  22222,  33333,  44444,  55555,  66666],
        [111111, 222222, 333333, 444444, 555555, 666666]]])

2.2 取出所有的带 1,2,3 的数

brr13 = brr[:,:, :3] 
brr13
array([[[     1,      2,      3],
        [    11,     22,     33],
        [   111,    222,    333],
        [  1111,   2222,   3333],
        [ 11111,  22222,  33333],
        [111111, 222222, 333333]]])
brr46 = brr[:,:,3:6]
brr46
array([[[     4,      5,      6],
        [    44,     55,     66],
        [   444,    555,    666],
        [  4444,   5555,   6666],
        [ 44444,  55555,  66666],
        [444444, 555555, 666666]]])

2.3 还原成原数组

# 还原失败
np.hstack( ( brr13, brr46 ) )
array([[[     1,      2,      3],
        [    11,     22,     33],
        [   111,    222,    333],
        [  1111,   2222,   3333],
        [ 11111,  22222,  33333],
        [111111, 222222, 333333],
        [     4,      5,      6],
        [    44,     55,     66],
        [   444,    555,    666],
        [  4444,   5555,   6666],
        [ 44444,  55555,  66666],
        [444444, 555555, 666666]]])
np.vstack( ( brr13, brr46 ) )
array([[[     1,      2,      3],
        [    11,     22,     33],
        [   111,    222,    333],
        [  1111,   2222,   3333],
        [ 11111,  22222,  33333],
        [111111, 222222, 333333]],

       [[     4,      5,      6],
        [    44,     55,     66],
        [   444,    555,    666],
        [  4444,   5555,   6666],
        [ 44444,  55555,  66666],
        [444444, 555555, 666666]]])

2.4 高纬度拼接只能用concatenate 或者配合 reshape来用

np.concatenate(  ( brr13, brr46 ) , axis = 2 ) # 
array([[[     1,      2,      3,      4,      5,      6],
        [    11,     22,     33,     44,     55,     66],
        [   111,    222,    333,    444,    555,    666],
        [  1111,   2222,   3333,   4444,   5555,   6666],
        [ 11111,  22222,  33333,  44444,  55555,  66666],
        [111111, 222222, 333333, 444444, 555555, 666666]]])

本案例中,brr的数据共分成 0, 1, 2 三个维度, 其中数据存储全部存储到 2维度中,

用到哪个维度的数据拼接就将 axis的维度写上

标签:concatenate,3333,hstack,55,666,66666,vstack,array,222
来源: https://blog.csdn.net/YENTERTAINR/article/details/119490443

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

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

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

ICode9版权所有