维度介绍
numpy中的ndarray的维度是做机器学习中经常用的,是一个基本以及必须要熟悉掌握的知识点,对于初学者来说很有可能迷惑。原因在于现实生活中所说的维一般而言是几何上的概念,如一维是直线(直线上有无数个点),二维是平面(平面有无数条线),三维为体(有无数个面)。
而在机器学习以及数据分析中的维数是数据空间的一种描述方式,更接近于张量的阶数,如(2,2,3),解读如下:
- 一般用元组来表示维度信息,其中元组的大小,表达维度的数量,这里为3维。
- 元组中每个元素的数值代表该维度上的元素数量信息,具体的如下:
* 第一维有2个子元素,每个子元素为2*3的矩阵
* 第二维有2个子元素,每个子元素为元素长度为3的数组
* 第3维有3个子元素,每个子元素,为一个具体的实数
举例如下:
a=np.ones([2,2,3])#创建两个2行3列的数组(矩阵)
a
array([[[ 1., 1., 1.],
[ 1., 1., 1.]],
[[ 1., 1., 1.],
[ 1., 1., 1.]]])
第一维元素数为2,元素都是:
[[ 1., 1., 1.],[ 1., 1., 1.]]
第二维元素数为2,每一个元素都是:
[ 1., 1., 1.]
第三维元素数为3,每一个元素都是:
1.
由于ndarray的维度和张量的阶数相似,故tensorflow的张量的维度的理解也是相似的。
shape()
用来查看数组或者矩阵的维数,shape[0]是第一维的维数,shape[1]是第二维的维数。通常来说,第一维和第二维,是行和列。另外的我们可以从外向内数“[]”来进行维度元素的辨别。遇见的第一个“[]”为第一维,里面的元素个数为第一维的元素个数。然后再数第一维任意元素的“[]”,如果没有[],说明是一维,有就是第二维…,以此类推,可以确定第n维以及第n维的元素。,如:
reshape()
改变数组的形状,并且原始数据不发生变化。但是,reshape()函数中的参数需要满足乘积等于数组中数据总数.
如:当我们将8个数使用(2,3)重新排列时,python会报错
重要的方法:
数组打平为一维数组
-
将数组变成一维的方法,即在只指定第一维,且第一维的元素个数为数组元素个数的总数reshape(total_num,):
b=np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]]) #output: array([[ 1, 2, 3, 4], [ 4, 5, 6, 7], [ 7, 8, 9, 10]]) b.reshape(12,) #output array([ 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10])
二维数组的打平为1行n列
-
二维数组的打平为1行n列的方法:reshape(1,-1)
b.reshape(1,-1) #output,注意跟打平为一维的区别,虽然数据都居中在一个括号内,但是括号的数量是不一样的 array([[ 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10]])
二维数组打平为n行1列
-
二维数组打平为n行1列的方法: reshape(-1,1)
b.reshape(-1,1) #output array([[ 1], [ 2], [ 3], [ 4], [ 4], [ 5], [ 6], [ 7], [ 7], [ 8], [ 9], [10]])
reshape中-1参数的含义
-
reshape中-1参数的含义,由于reshape的维数上数字的乘积必须等于元素的个数,而-1表示这一维需要进行元素的个数自行计算:
b.reshape(2,-1,3)
#output
array([[[ 1, 2, 3],
[ 4, 4, 5]],
[[ 6, 7, 7],
[ 8, 9, 10]]])