python代码,如何理解numpy的ndarray扩维函数expand_dims?
发布于 作者:苏南大叔 来源:程序如此灵动~
对于numpy中的数组ndarray类型,有个维度ndim的概念。其实,维度就是指几重数组。而且ndarray中的元素,同一维度下,数量必须一致。这就是和传统的数组,所不一样的地方。

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文记录如何扩展ndarray的维度,也就是客观的改变.shape属性。测试环境:win10,python@3.6.8。
ndarray基本概念
本文描述的.expand_dims()函数,是作用于ndarray类型上面的。所以,需要定义几个ndarray变量。具体可以参考:
在本文的代码例子中,使用.shape形状的概念,来体现.ndim维度的概念。
import numpy as np
aa = np.array([1, 2])
a2 = np.random.randint(1, 3, size=(2, 3))
print(aa.shape)
print(a2.shape).expand_dims()的axis参数
.expand_dims()是个扩维函数,第一个参数就是被扩维的数组,第二个参数axis就是被扩容的位置。为了更好的理解这个函数,最好先观察它的维度信息。

一个数组的.shape信息,是个元组,也可以理解为不可变数组。它的第一个值就是axis=0的位置,第二个值就是axis=1的位置。被扩容后,对应的轴索引为[0],其它轴后移。
import numpy as np
aa = np.array([1, 2])
print(aa.shape,aa[1],aa)
a2 = np.expand_dims(aa,axis=0)
print(a2.shape,a2[0,1],a2[0][3],a2)
a3 = np.expand_dims(a2,axis=1)
print(a3.shape,a3[0,0,1],a3[0][0][1],a3)axis取负数的时候,就是从最后的位置添加的。-1就是添加在最后,-2就是添加在倒数第二位,后面的向右移动。
a4 = np.expand_dims(a3,axis=-1)
print(a4.shape,a4[0,0,1,0],a4)
a5 = np.expand_dims(a4,axis=-2)
print(a5.shape,a5[0,0,1,0,0],a5)
a6 = np.expand_dims(a5,axis=-3)
print(a6.shape,a6[0,0,1,0,0,0],a6)下面做个图表,对于最初始的一维数组[1,2]中的2,axis是顺序叠加的。做个总结:
| 维度 | 初始shape | 访问到2的脚本索引 | 访问到2的脚本索引表示2 | 叠加axis进入下一行 |
|---|---|---|---|---|
| 1 | (2,) | [1] | [1] | 0 |
| 2 | (1,2) | 【0】[1] | [0,1] | 1 |
| 3 | (1,1,2) | [0]【0】[1] | [0,0,1] | -1 |
| 4 | (1,1,2,1) | [0][0][1]【0】 | [0,0,1,0] | -2 |
| 5 | (1,1,2,1,1) | [0][0][1]【0】[0] | [0,0,1,0,0] | 前四状态,第五动作,这里没动作 |
其实,变化最大的还是变量本身,随着维度的增加,数据也变得越来越复杂和难以理解。不过,大多数时候,大家用到的也就是2维数组。所以,也不用多耗费脑细胞,去想象3维4维甚至5维数组到底是什么样子的。
如果不顺序叠加的话,就是说axis不按套路出牌的话,报错类似如下:
numpy.AxisError: axis 2 is out of bounds for array of dimension 2.expand_dims()扩维前后
扩维前后的变量存在引用关系!!!扩维前的变量变的话,后面的变量也发生变化!请看下面的代码:
import numpy as np
b1 = np.random.randint(1, 3, size=(2, 3))
print(b1)
# [[2 2 2]
# [1 1 2]]
b2 = np.expand_dims(b1, axis=0)
b1[0][0]=100
print(b1)
# [[100 1 1]
# [ 2 1 2]]
print(b2)
# [[[100 2 2]
# [ 1 1 2]]]上面的例子中,b1扩容后形成b2,然后修改b1,然而b2显示也被修改了。不是说两个变量是引用关系,而是说后者变量的一部分是引用到了原变量。
相关链接
- https://newsn.net/say/python-ndarray.html
- https://newsn.net/say/python-tuple.html
- https://newsn.net/say/python-set-vs-list.html
- https://newsn.net/say/python-set-diff.html
综述
这个扩维函数,可以用于机器学习过程中,对某条数据进行扩维,从而适合机器学习的计算。更多python相关文章,请点击: