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