TensorFlow和Numpy矩阵操作中axis理解及axis=-1的解释

 更新时间:2022年03月24日 11:09:45   作者:洋芋炒土豆片片  
在调用numpy库中的concatenate()时,有遇到axis=-1/1/0的情况,下面这篇文章主要给大家介绍了关于TensorFlow和Numpy矩阵操作中axis理解及axis=-1解释的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

1. axis的基本使用

axis常常用在numpy和tensorflow中用到,作为对矩阵(张量)进行操作时需要指定的重要参数之一。设定axis=-1,0,1...,用来指定执行操作的数据如何划分。

一句话解释:设axis=i,则沿着第i个下标变化的方向进行操作![1]

简单例子就不举了,其他博客有很多,这里举一个稍微复杂一点的三维矩阵的例子:

设embeddings是一个shape=[3,4,5]的矩阵,如下:

embeddings =    [[[-0.30166972  0.25741747 -0.07442257  0.24321035 -0.3538919 ]
                  [-0.22572032  0.1288028  -0.4686908  -0.07217035  0.05287632]
                  [ 0.15845934  0.07064888  0.00922218  0.2841002  -0.24992025]
                  [ 0.43347922 -0.43738696 -0.08176881  0.34185413 -0.2826353 ]]
                
                 [[-0.08590135  0.06792518 -0.07807922 -0.28746927 -0.10613027]
                  [ 0.07476929  0.132256   -0.0926154   0.39621904  0.2497718 ]
                  [-0.15389556  0.0867373   0.19403657 -0.11003655  0.317669  ]
                  [ 0.3949038  -0.17275128  0.34710506 -0.02576578 -0.17427891]]
                
                 [[-0.27703786  0.02631402  0.22129896 -0.07714707  0.41439041]
                  [-0.08512023  0.19059369 -0.13418713 -0.12881753 -0.26143318]
                  [-0.333749    0.27034065  0.45429572 -0.46164128 -0.3955955 ]
                  [ 0.24430516 -0.3841647   0.37126407 -0.463441   -0.1441828 ]]]

对embeddings矩阵执行下面操作:

a = tf.math.argmax(embeddings, axis=-1)   # tf.math.argmax=tf.argmax,用来返回最大数值对应的index
b = tf.math.argmax(embeddings, axis=1)
c = tf.math.argmax(embeddings, axis=0)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
   
    print(embeddings.eval())   # a.eval 在打印时,等同于 sess.run(a)
    print(a.eval())
    print(b.eval())
    print(c.eval())

得到的结果是:

[[1 1 3 0]
 [1 3 4 0]
 [4 1 2 2]]   # axis=-1, shape=[3,4]
 
[[3 0 2 3 1]
 [3 1 3 1 2]
 [3 2 2 0 0]]   # axis=1, shape=[3,5]
 
[[1 0 2 0 2]
 [1 2 1 1 1]
 [0 2 2 0 1]
 [0 1 2 0 2]]   # axis=0, shape=[4,5]

看懂了吗?参考上面的一句话解释,再结合矩阵的下标表示理解一下。

刚刚的矩阵写成下标表示就是:

embeddings = [[[a000,a001,a002,a003,a004],
               [a010,a011,a012,a013,a014],
               [a020,a021,a022,a023,a024],              
               [a030,a031,a032,a033,a034]]
              
              [[a100,a101,a102,a103,a104],
               [a110,a111,a112,a113,a114],
               [a120,a121,a122,a123,a124],              
               [a130,a131,a132,a133,a134]]
              
              [[a200,a201,a202,a203,a204],
               [a210,a211,a212,a213,a214],
               [a220,a221,a222,a223,a224],              
               [a230,a231,a232,a233,a234]]                

以axis=0为例,则沿着第0个下标(最左边的下标)变化的方向进行操作,也就是将除了第0个下标外,其他两个下标都相同的部分分成一组,然后再进行操作。具体分组如下(省略了一些组):

从上图可以看出,每3个数分成一组,所以现在总共是分了4*5个组(所以最终返回的结果也是一个shape=[4,5]的矩阵),对每个组都执行一次 reduce_max操作,将每个组的三个数中数值最大的数的index返回构成矩阵即可。

这里需要特别说明一下axis=-1的操作,可能对python不熟悉的人会不理解这里的-1是哪个维度。在pyhton中,-1代表倒数第一个,也就是说,假如你的矩阵shape=[3,4,5],那么对这个矩阵来说,axis=-1,其实也就等于axis=2。因为这是个三维矩阵,所以axis可能的取值为0,1,2,所以最后一个就是2。你可以自己试试看两个取值结果是否相同。

2. 对axis的理解

通过上面的例子,你可能已经发现了,axis是将矩阵进行分组,然后再操作。而分组则意味着会降维。

以刚刚的例子,原始矩阵的shape=[3,4,5],取axis=0再进行操作后,得到的矩阵shape=[4,5]。同样的,取axis=1再进行操作后,得到的矩阵shape=[3,5]。取axis=-1(axis=2)再操作后,shape=[3,4]。掌握这一点,能有利于你在神经网络中的变换或是数据操作中明确矩阵变换前后的形状,从而加快对模型的理解。

总结

到此这篇关于TensorFlow和Numpy矩阵操作中axis理解及axis=-1解释的文章就介绍到这了,更多相关矩阵操作中axis=-1的解释内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

参考资料

[1] 这个一句话解释来源于:https://www.jb51.net/article/242077.htm

相关文章

  • python 时间 T 去掉 带上ms 毫秒 时间格式的操作

    python 时间 T 去掉 带上ms 毫秒 时间格式的操作

    这篇文章主要介绍了python 时间 T 去掉 带上ms 毫秒 时间格式的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Python编程实现数学运算求一元二次方程的实根算法示例

    Python编程实现数学运算求一元二次方程的实根算法示例

    这篇文章主要介绍了Python编程实现数学运算求一元二次方程的实根算法,涉及Python数学运算求解方程的相关实现技巧,需要的朋友可以参考下
    2017-04-04
  • Python内存管理器如何实现池化技术

    Python内存管理器如何实现池化技术

    Python中的内存管理是从三个方面来进行的,一对象的引用计数机制,二垃圾回收机制,三内存池机制,下面这篇文章主要给大家介绍了关于Python内存管理器如何实现池化技术的相关资料,需要的朋友可以参考下
    2022-05-05
  • Python实现partial改变方法默认参数

    Python实现partial改变方法默认参数

    这篇文章主要介绍了Python实现partial改变方法默认参数,需要的朋友可以参考下
    2014-08-08
  • Python利用Beautiful Soup模块修改内容方法示例

    Python利用Beautiful Soup模块修改内容方法示例

    Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python 库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。他还能够修改HTML/XML文档的内容。这篇文章主要介绍了Python利用Beautiful Soup模块修改内容的方法,需要的朋友可以参考下。
    2017-03-03
  • Django CBV类的用法详解

    Django CBV类的用法详解

    这篇文章主要介绍了Django CBV类的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 浅析python中的绝对导入和相对导入

    浅析python中的绝对导入和相对导入

    这篇文章主要是想和大家简单聊聊python中绝对导入和相对导入的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考下
    2023-09-09
  • 关于Python中Flask全局异常处理流程详解

    关于Python中Flask全局异常处理流程详解

    Flask是一个基于Python的Web框架,它提供了全局异常处理的机制来捕获和处理应用程序中的异常,本文将详细介绍Flask的全局异常处理,并提供相应的代码示例,需要的朋友可以参考下
    2023-06-06
  • 解决py2exe打包后,总是多显示一个DOS黑色窗口的问题

    解决py2exe打包后,总是多显示一个DOS黑色窗口的问题

    今天小编就为大家分享一篇解决py2exe打包后,总是多显示一个DOS黑色窗口的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 基于python实现智能用例生成工具

    基于python实现智能用例生成工具

    这篇文章主要为大家详细介绍了如何基于python实现智能用例生成工具,即根据输入的功能点,生成通用测试点,感兴趣的小伙伴可以跟随小编一起了解下
    2023-09-09

最新评论