函数take_along_axis()用于由索引矩阵生成新的矩阵。

提问:由已有矩阵的索引生成新的矩阵为什么要用函数take_along_axis(),我用Numpy库ndarray对象的切片操作不行么?

答案是:Numpy库ndarray对象的切片操作不是万能的,比如下面的两种情况它就不能解决,而下面两种情况可以用函数take_along_axis()解决。

情况一:我由argsort()函数得到了矩阵元素按从小到大排序的索引,接下来我想由个这个排序索引得到一个新的矩阵,这个新矩阵的元素就是按从小到大排列的。这种情况下光靠切片操作就很难实现这个功能了。不信的话诸君可以试一试,反正昊虹君是试了的,很麻烦。但是此时用函数take_along_axis()就很方便,示例如下:

import numpy as npA = np.array([[10, 30, 20], [60, 40, 50]])
B = np.sort(A, axis=1)
index1 = np.argsort(A, axis=1)
C = np.take_along_axis(A, index1, axis=1)

运行结果如下:

从这个示例可以看出,函数take_along_axis()很方便的帮我们通过索引值矩阵index1按序取出了A中的元素形成了数组C。

情况二:
现有三维矩阵A如下:

A = np.arange(2*3*4).reshape([2, 3, 4])



现在要实现下面这个目标:
选取A的第0页的第1行和A的第1页的第2行构成一个新的三维矩阵B,B矩阵的形状为(2, 1, 4)。
这个目标用切片操作是无法实现的,昊虹君也尝试过直接用切片实现这个目标,但无奈没有成功。
不过这个目标用函数take_along_axis()就很容易实现了,实现的代码如下:

# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询# OpenCV的版本为4.4.0import numpy as np
A = np.arange(2*3*4).reshape([2, 3, 4])index1 = np.zeros([2, 1, 1]).astype('int')index1[0, 0, :] = 1
index1[1, 0, :] = 2B = np.take_along_axis(A, index1, axis=1)

运行结果如下:


从上面的结果来看,代码的确实现了“选取A的第0页的第1行和A的第1页的第2行构成一个新的三维矩阵B,B矩阵的形状为(2, 1, 4)。”

具体是怎么实现的,
昊虹君参考博文https://blog.csdn.net/baidu_37157624/article/details/123124561,
并仔细思考后得到了其实现原理的精炼理解。

具体其实现原理的精炼理解,
昊虹君把它写在了博文 https://www.hhai.cc/thread-120-1-1.html 中,请大家跳转浏览,谢谢。

补充说明:
①使用函数take_along_axis()时要注意,索引矩阵index1的维度数应该和原矩阵A的维度数相同。
②二维以下时实现上面的功能是完全可以用ndarray的切片或方法take()实现的。
关于ndarray的切片操作的详细介绍见博文 https://www.hhai.cc/thread-117-1-1.html
关于方法take()的详细介绍见博文 https://www.hhai.cc/thread-121-1-1.html

详解Python_Numpy库函数take_along_axis()【由索引矩阵生成新的矩阵】相关推荐

  1. Gcc详解以及静态库、动态库生成

    [转] Gcc详解以及静态库.动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1.gcc包含的c/c++编译 ...

  2. 斯坦福NLP名课带学详解 | CS224n 第15讲 - NLP文本生成任务(NLP通关指南·完结)

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://ww ...

  3. Menu详解(二):利用XML生成菜单和子菜单

    前言:上篇,我们说了有关代码生成菜单和子菜单的方法,这里我们再讲讲有关利用XML生成菜单和子菜单的问题. 业精于勤,荒于嬉,行成于思,毁于随 (日拱一卒) 系列文章: 1.<Menu详解(一): ...

  4. 用于生成随机数的python标准库模块是_详解Python基础random模块随机数的生成

    详解Python基础random模块随机数的生成 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  详解Python基础random模块随机数的生成.txt ] ( ...

  5. Elastricsearch 索引操作详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  6. 【OpenCV 4开发详解】图像噪声的种类与生成

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. java 8 新功能详解_Java 8和Java 14之间的新功能

    java 8 新功能详解 从版本9开始,Java每6个月就有一次新功能,因此很难跟踪这些新更改. 互联网上的大多数信息都描述了最近2个Java版本之间的变化. 但是,如果您的情况与我相似,则说明您使用 ...

  8. python random库生成伯努利随机数的方法_详解Python基础random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  9. 波士顿矩阵和新波士顿矩阵

    背景 在制定公司层战略的时候,BCG矩阵(波士顿矩阵)是一种非常流行的方法,下面咱们就来聊聊波士顿矩阵和他的弟弟新波士顿矩阵叭 首先呢这两哥们,都是由波士顿咨询集团(Boston Consulting ...

最新文章

  1. Vue-Router API参考
  2. mybatis数据库数据分页问题
  3. 【pyradiomics学习】——影像组学特征
  4. qt qss设置字体大小_Qt编写自定义控件70-扁平化flatui
  5. php处理结果集,php中mysqli 处理查询结果集的几个方法
  6. Java ——异常处理
  7. win10 忘记登录密码后 修改密码
  8. linux下qt实现vlc视频播放器,Qt编写视频播放器(vlc内核)
  9. matlab脉冲调制,基于matlab脉宽调制方法的研究
  10. 让你的网站用上炫酷的中文字体
  11. 新版电脑版微信终于可以用上小程序了
  12. 【顺序表】SqList *L是什么意思
  13. uni-app 快速集成 IM 即时通信的方法——TUIKit 来啦
  14. matlab 打包封装,matlab中如何封装打包成exe文件
  15. 收银系统的优势功能有哪些?
  16. 《C++新经典Linux C++通信架构实战》第1章 课程介绍
  17. 报错:ERROR: for nginx Cannot start service proxy;for proxy Cannot start service proxy;......
  18. 新征程,筑生态 - 华为中国ICT生态之行2017走进武汉
  19. 软碟通 UltraISO V9.6.0.3000 官方多语言安装版(附注册码)
  20. ECCV 2020 论文大盘点-图像视频修复篇

热门文章

  1. 【解决】addEventListener监听滚动与removeEventListener移除监听阻止冒泡(e.preventDefault())不生效
  2. Acwing第 68 场周赛【未完结】
  3. 【CSS-Part3 ------样式显示模式、背景设置、三大特性 】
  4. 英语基本语法(三)-代词
  5. springboot集成swagger3与knife4j
  6. c语言在线考试系统的需求分析,基于C/S架构的通用计算机在线考试系统
  7. 有主机出现报警“刷新硬件 IPMI 系统事件日志”出现常规性系统错误“Retrleve IPMI DEL request to host failed,事件中有很多相关报警
  8. 数据分析案例学习---关于“线上教育提升毛利额问题
  9. 2.Java 网络编程TCP通讯例子 双向发送
  10. 平面图转对偶图的应用