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
相关文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。