矩阵 维度 axis

python numpy tenforflow中维度的概念是什么呢?

怎么用python语言来表示维度呢?

我们在利用深度学习进行目标检测的过程中,经过会进行批量图片的处理,常见格式为(batchsize,size,size,channel)四维的矩阵。或者yolo3 backbone输出的矩阵(batch,feature_map_size,feature_map_size,anchor_num,(xmin,ymin,xmax,ymax,socre,class1,...,classn))等。在处理过程中,经常会涉及到对矩阵的各个维度的操作。

比如:

增加维度

减少维度

对某一维度进行取值

对不同维度直间进行比较

对不同维度求均值

等等。

例1:提取多维矩阵中特定维度的前n个"数"(此处用"数"表示感觉不太准确,一维矩阵可以说是“数”,多维矩阵应该是“向量”,如果您有更好的表述,欢迎留言讨论)

我们首先,创建一个最简单的一维矩阵

import numpy as np
a=np.array([1,2,3,4])
print(a.shape)
=》(4,)

利用shape方法获取矩阵的维度,可以看到矩阵是一维的,里面有四个数字,如果我们想获取矩阵中的某些数字,可以利用python的切片功能,在python中[]可以理解为是切片的代名词。继续上面的例子,

import numpy as np
a=np.array([1,2,3,4])
print(a.shape)
=》(4,)
print(a[0])#获取第0个元素
=>1
print(a[0,1])#会报错
print(a[0:2])#获取前两个元素
=》1,2
print([:])
 

关于维度在numpy中的理解,我们可以这样理解,[]中用逗号","隔开的是不同的维度,每一个维度的数据获取可以用:切片进行操作,其中[...,]三个点代表前面所有的维度,:表示去这一维度所有数,::表示取这一维度从strat到end的数,:::表示start-end-step每隔step取数。

例2:通过python中numpy.mean()函数,深度理解axis的含义

numpy.mean()传送门
numpy.mean(a, axis=None, dtype=None, out=None, keepdims=)
a:为array形的数据
axis:
科普下,axis=0表示纵轴的方向,axis=1表示横轴的方向
1)axis为二维array时:axis可为0,1两个方向轴
不填时默认为a全部元素的平均值
axis=0 表示纵轴平均,输出的是格式(1,x)的格式
axis=1表示横轴的平均,输出的是(x,1)的格式
2)axis为三维array时
axis可以为0,1,2表示三个方向轴,用tuple来表示取哪两个维度的数值作为平均,即对一个平面进行取平均
3)axis为n维array时
如果这是一个整数元组,则在多个轴上执行平均值,而不是像以前那样在单个轴或所有轴上执行。
可取n-1个轴

举例:
设a为(m,n)的array,则axis中0,1分别代表纵轴和横轴

>>> a = np.arange(15)
>>> a = a.reshape(3,5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
#取全部的平均值
>>> np.mean(a)
7.0

#取纵轴上的平均值
>>> np.mean(a,axis=0)
array([5., 6., 7., 8., 9.])

#取横轴上的平均值
>>> np.mean(a,axis=1)
array([ 2.,  7., 12.])

设a为(m,n,k)的array,则axis中的0,1,2分别代表三个轴
若axis为(0,1),则相当于把m,n这两条轴压平(m,n轴上的m*n个数值求平均),输出格式为(1,k)的数值

#设a为(2,3,4)的array
>>> a = np.arange(24)
>>> a = a.reshape(2,3,4)
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

#对第二轴上的数字取平均,压缩成(2,4)输出了
>>> np.mean(a,axis=1)
array([[ 4.,  5.,  6.,  7.],
       [16., 17., 18., 19.]])
       
#将0,1轴方向的2*3个数值取平均
>>> np.mean(a,axis=(0,1)) 
array([10., 11., 12., 13.])

#将0,2轴方向的2*4个数值取平均
>>> np.mean(a,axis=(0,2))
array([ 7.5, 11.5, 15.5])

以上情况可以类比到n维,不再举例

例三:关于利用yolo3进行目标检测中用到的矩阵知识,见github,欢迎加星点赞。

你可能感兴趣的:(机器学习模型,数学知识,python,numpy,维度)