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

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的维度写上

上一篇:用户交互,流程控制


下一篇:Nios ii 实战篇--- DDR2