np.expand_dims
:字面意思,增加维度
先认识一下维度的概念:以下给出了一个array,其shape=(2, 3, 2, 3)
,如何看array的维度呢?有几层中括号,维度就是几。从最外面的中括号开始看,第0维是看第一个中括号,其中包含两个部分,所以大小是2;第1维就是看第二层括号,其中包含了三小项,所以大小是3;依次类推。该矩阵来源
np.array(
[
[
[
[1,2,3],
[4,5,6]
],
[
[7,8,9],
[10,11,12]
],
[
[13,14,15],
[16,17,18]
]
],
[
[
[19,20,21],
[22,23,24]
],
[
[25,26,27],
[28,29,30]
],
[
[31,32,33],
[34,35,36]
]
]
]).shape
接下来比较立体的解释一下:
import numpy as np
x = np.arange(1,7).reshape(2,3)
np.expand_dims(x,axis=0)
np.expand_dims(x,axis=1) # 表示增加第二个维度(第二层中括号),也就是第1维(因为从0开始表示)
np.expand_dims(x,axis=-1) # 表示最后增加一个维度,当然此处可以写2
# x初始状态是两个维度的,x.ndim=2
x:array([[1, 2, 3],
[4, 5, 6]])
x.shape = (2, 3)
# 增加第一维
x_expand_axis0:array([[[1, 2, 3],
[4, 5, 6]]])
x_expand_axis0.shape = (1, 2, 3)
# 增加第二维
x_expand_axis1:array([[[1, 2, 3]],
[[4, 5, 6]]])
x_expand_axis1.shape = (2, 1, 3)
# 增加第三维
x_expand_axis2:array([[[1],
[2],
[3]],
[[4],
[5],
[6]]])
x_expand_axis2.shape = (2, 3, 1)
其实可以将你想要增加维度的数组直接用reshape
也可以产生同样的效果。
x = np.arange(1,7).reshape(2,3)
x = np.expand_dims(x,axis=-1)
就等同于:
x = np.arange(1,7).reshape(2,3,1)
最后,学习知乎上的一种理解方式,在坐标轴上立体的表示数据:
比如shape = (2,3)
的数据表示在一个二维坐标轴中,如图:
shape = (2, 3, 1)
的数据相当于在z
轴的高度是1,如图:(从左往右是x轴方向,从下往上是y轴方向,不会画图,自行体会,可以自己在本子上画一画加深理解)
3 | 6 |
---|---|
2 | 5 |
1 | 4 |
vstack
,今天一个高维度的堆叠把我整乱了,各种试,以下是成果:
在二维堆叠中,vstack
是沿着垂直方向上堆叠,其实就是行数增加了。
a = np.arange(6).reshape(3,2)
np.vstack(a).shape # (3,2)
np.hstack(a).shape # (6,)
# 首先创建一个优雅的高维度list,按照上面的方法,你一定很容易的得出该list的shape了
a = [
[
[
[1,2,3],
[4,5,6]
],
[
[1,2,3],
[4,5,6]
]
],
[
[
[1,2,3],
[4,5,6]
],
[
[1,2,3],
[4,5,6]
]
],
[
[
[1,2,3],
[4,5,6]
],
[
[1,2,3],
[4,5,6]
]
]
]
# 把list转为numpy的array,并查一下shape=(3, 2, 2, 3)
a = np.asarray(a)
# a.shape
# 然后np.vstack(a)是哪一维度堆叠呢?查一下他的shape=(6,2,3)
b = np.vstack(a)
# np.vstack(a).shape
"""
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
"""
"""
分析:可以这么理解,堆叠前的a相当于是3个大块矩阵,这每一个大块的shape是(2,2,3),大块又是2个竖着的(2,3)小块,沿着垂直方向堆积,其实就是一坨一坨竖着放在一起
(2,3)
(2,3)
(2,3)
(2,3)
(2,3)
(2,3)
形成这样的矩阵,就是(6,2,3)了
"""
# 多试几次就明白了,第一个维度其实都是竖着排列的,将后面用不着的维度都视作小块
a = np.arange(90).reshape(3,2,5,3)
np.vstack(a).shape # (6, 5, 3)
np.hstack(a).shape # (2, 15, 3)
"""
hstack
(5,3)(5,3)(5,3)
(5,3)(5,3)(5,3)
"""
还有一个奇怪的现象:就是外面又套了一层中括号,导致维度增加,我没发现
sum = []
a = np.arange(12).reshape(2,3,2)
sum.append(a)
sum.append(a)
np.asarray(a).shape # (2,2,3,2)
简单图示:就是说除了最右边那一维度(这里是5),其他维度都是竖着排列的,哈哈哈哈!能理解就行,徒步豪华: