我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

对于numpy中的数组ndarray类型,有个维度ndim的概念。其实,维度就是指几重数组。而且ndarray中的元素,同一维度下,数量必须一致。这就是和传统的数组,所不一样的地方。

苏南大叔:python代码,如何理解numpy的ndarray扩维函数expand_dims? - 数组扩维函数
python代码,如何理解numpy的ndarray扩维函数expand_dims?(图2-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文记录如何扩展ndarray的维度,也就是客观的改变.shape属性。测试环境:win10python@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就是被扩容的位置。为了更好的理解这个函数,最好先观察它的维度信息。

苏南大叔:python代码,如何理解numpy的ndarray扩维函数expand_dims? - 维度扩展代码
python代码,如何理解numpy的ndarray扩维函数expand_dims?(图2-2)

一个数组的.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]中的2axis是顺序叠加的。做个总结:

维度初始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显示也被修改了。不是说两个变量是引用关系,而是说后者变量的一部分是引用到了原变量。

相关链接

综述

这个扩维函数,可以用于机器学习过程中,对某条数据进行扩维,从而适合机器学习的计算。更多python相关文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    numpy