目录
摘要 : 在例行学习《机器学习实战》中的代码部分时,遇到使用基于Python的Numpy包中array中的min()函数时,不理解其axis参数的规律和使用方法。二维三维还能够画画图去想象,或是排除法总结,然而超过三维的张量形式对于初学者的我就无法办法理解,如何去求其张量(Tensor)的min和max。困与此惑,通过实际理解张量的物理意义并结合代码实现,去理解min函数中所指axis的含义和使用方法,以便今后大量使用张量,对张量内部的张量进行比较时,能不混淆其axis和维的意义,如有错误敬请指正!幼稚之作勿喷LOL
函数描述
def min(self, axis=None, out=None, keepdims=False): # real signature unknown; restored from __doc__
"""
a.min(axis=None, out=None, keepdims=False)
Return the minimum along a given axis.
Refer to `numpy.amin` for full documentation.
See Also
--------
numpy.amin : equivalent function
"""
pass
以上的代码为array.min()的定义部分,其中描述转向numpy.amin部分,如下链接为Numpy.amin的参考页。
对于不想去看参考页的筒子们,上述definition就表述了一句话:
Return the minimum along a given axis.
返回一个沿给定轴的最小值
也就是说可以把整个函数看做:
def min(self,axis):
return arrayMin
基于图像原理的测试
本人好奇如何使用该函数于是编写一小段批处理图像的张量代码如下:
arrayTest = array([[[0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]],
[[2.1,2.2,2.3,2.4],[2.4,2.3,2.2,2.1]],
[[1.1,1.2,1.3,1.4],[1.4,1.3,1.2,1.1]]])
""" 假设其中最小生成元为颜色像素[R,G,B,alpha],
2个颜色像素组成一个整体为X维,
3个整体再次组合为Y维
"""
print(arrayTest.shape)
#打印出该array的构成
使用图片表示该张量的结构为:
颜色元C维为共有4个元素,然后X维方向由2个颜色元组成,Y维由3个成对的颜色元组成。
组成的顺序是 C → X → Y
通过运行上述代码可得一下结果:
(3, 2, 4)
因此可以知道其输出的shape:
(3, 2, 4)对应(Y,X,C)
对应输出不同维下最值:
# 打印出arrayTest中的最大最小值
print(arrayTest.min())
print(arrayTest.max())
# 打印出arrayTest中第1维(Y)的最大最小张量
print('0:\n\t')
print(arrayTest.min(0))
print(arrayTest.max(0))
# 打印出arrayTest中第2维(X)的最大最小张量
print('1:\n\t')
print(arrayTest.min(1))
print(arrayTest.max(1))
# 打印出arrayTest中第3维(C)的最大最小张量
print('2:\n\t')
print(arrayTest.min(2))
print(arrayTest.max(2))
结果如下:
0.1
2.4
0: # 沿Y轴方向
"""
提取Y轴方向上,RGBA分别的最值,即比较Y轴方向上的所有像素点,提取RGBA的最值
"""
#最小
[[0.1 0.2 0.3 0.4]
[0.4 0.3 0.2 0.1]]
#最大
[[2.1 2.2 2.3 2.4]
[2.4 2.3 2.2 2.1]]
1: # 沿X轴方向
"""
提取X轴方向上,RGBA分别的最值,即比较X轴方向上的所有像素点,提取RGBA的最值
"""
#最小
[[0.1 0.2 0.2 0.1]
[2.1 2.2 2.2 2.1]
[1.1 1.2 1.2 1.1]]
#最大
[[0.4 0.3 0.3 0.4]
[2.4 2.3 2.3 2.4]
[1.4 1.3 1.3 1.4]]
2: # 沿C轴方向
"""
提取C轴方向上,RGBA中的最值(没有任何物理意义)
"""
#最小
[[0.1 0.1]
[2.1 2.1]
[1.1 1.1]]
#最大
[[0.4 0.4]
[2.4 2.4]
[1.4 1.4]]
结果分析与方法
根据结果可以将提取最值的操作理解成一个按原顺序不变的降维过程,只不过降维算法为取最值:
沿Y轴方向时:(Y,X,C)→ 降维成 (X,C)即(2,4):分别找到Y轴方向与新元的逗号所在位置,并列比较
沿X轴方向时:(Y,X,C)→ 降维成 (Y,C)即(3,4):分别找到X轴方向与新元的逗号所在位置,并列比较
沿C轴方向时:(Y,X,C)→ 降维成 (Y,X)即(3,2):分别找到C轴方向与新元的逗号所在位置,并列比较
以最后一个min(2)为例:
[[[0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]],
[[2.1,2.2,2.3,2.4],[2.4,2.3,2.2,2.1]],
[[1.1,1.2,1.3,1.4],[1.4,1.3,1.2,1.1]]]A:即压缩4个元素为元素,找到并列的4个逗号为逗号①,如[0.1,0.2,0.3,0.4]等,
B:再找到新元X的逗号如 [[...],[...]],为逗号②
C:将以逗号①并列的元素,以逗号②的形式比较得出最值
D:按照降维后的生成顺序(3,2),即以新元为元素生成
再以第一个min(0)为例:
[[[0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]],
[[2.1,2.2,2.3,2.4],[2.4,2.3,2.2,2.1]],
[[1.1,1.2,1.3,1.4],[1.4,1.3,1.2,1.1]]]A:即压缩3个元素为一个元素,找到并列的3个逗号为逗号①,如
[[[...],[...]],
[[...],[...]],
[[...],[...]]]B:再找到新元X的逗号如 [0.1,0.2,0.3,0.4],为逗号②
C:将以逗号①并列的元素,以逗号②的形式比较得出最值
[[[0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]],
[[2.1,2.2,2.3,2.4],[2.4,2.3,2.2,2.1]],
[[1.1,1.2,1.3,1.4],[1.4,1.3,1.2,1.1]]]0.1在 0.1,2.1,1.1中最小;0.2在 0.2,2.2,1.2中最小;0.3在 0.3,2.3,1.3中最小;0.4在 0.4,2.4,1.4中最小;
以此类推
D:按照降维后的生成顺序(2,4),即以新元为元素生成
拓展延伸
当我用N个2X3的图片组成新的张量的时候,此处N = 2时,
问题1:arrayTest.shape应该是什么结构?
问题2:如果我要输出min(0),降维后的shape应该是什么结构?应该如何去比较呢?
提示
问题1:(N,Y,X,C)
问题2:(Y,X,C)
有如 shape = (2,3,2,4)
[ [[[0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]],
[[2.1,2.2,2.3,2.4],[2.4,2.3,2.2,2.1]],
[[1.1,1.2,1.3,1.4],[1.4,1.3,1.2,1.1]]],[[[1.1,1.2,1.3,1.4],[1.4,1.3,1.2,1.1]],
[[2.1,2.2,2.3,2.4],[2.4,2.3,2.2,2.1]],
[[0.1,0.2,0.3,0.4],[0.4,0.3,0.2,0.1]]] ]求min(0) 有 minShape = (3,2,4)
有答案:
[[[0.1 ,0.2 ,0.3 ,0.4],[0.4 ,0.3 ,0.2 ,0.1]],
[[2.1 ,2.2 ,2.3 ,2.4],[2.4 ,2.3 ,2.2 ,2.1]],
[[0.1 ,0.2 ,0.3 ,0.4],[0.4 ,0.3 ,0.2 ,0.1]]]