讲解Python3中NumPy数组寻找特定元素下标的两种方法


Posted in Python onAugust 04, 2019

引子

Matlab中有一个函数叫做find,可以很方便地寻找数组内特定元素的下标,即:Find indices and values of nonzero elements。
这个函数非常有用。比如,我们想计算图1中点Q(x0, y0)抛物线的最短距离。一个可以实施的方法是:计算出抛物线上所有点到Q点的距离,找到最小值,用find函数找到最小值对应的下标,即M点横坐标和纵坐标对应的元素的下标,M点到Q点的距离就是最短距离。

讲解Python3中NumPy数组寻找特定元素下标的两种方法 

首先给出Matlab使用find函数实现的代码:

a = linspace(-5,5,1000);
b = a .^2;
x0 = 4;
y0 = 4;
dis = sqrt((a - x0).^2 + (b - y0).^2);
mm = find (dis == min(dis));
a0 = a(mm);
b0 = b(mm);
disMin = sqrt((a0 - x0).^2 + (b0 - y0).^2);
plot(a, b);
hold on;
scatter(x0, y0, 'k*');
scatter(a0, b0, 'k*');
xx = [a0, x0];
yy = [b0, y0];
plot(xx, yy);

讲解Python3中NumPy数组寻找特定元素下标的两种方法

NumPy中的where函数

Syntax: np.where(conditions, [x,y])

具体实现代码如下:

import numpy as np
import math
import matplotlib.pyplot as plt

a = np.linspace(-5, 5, 10000)
b = a * a
x0 = 4
y0 =4
num = np.linspace(0, len(a) - 1, len(a))
dis = np.linspace(0, 0, len(a))
for k in num:
  k = int(k)
  dis[k] = dis[k] + math.sqrt((a[k] -x0) **2 + (b[k] - y0) **2)
disMin = min(dis)
disMinIndex = np.where(dis == disMin)
disMin0 = math.sqrt((a[disMinIndex] - x0) **2 + (b[disMinIndex] - y0) **2)
print('The mininum distance:',disMin)
print('The mininum distance:',disMin0)
print(type(dis))
a0 = a[disMinIndex]
b0 = b[disMinIndex]
fig = plt.figure(figsize = (6,6), dpi = 200)
ax1 = plt.subplot(1,1,1)
line11 = ax1.scatter(a,b,s = 1)
line12 = ax1.scatter(x0, y0, s = 100, marker = '*', color = 'darkorange')
line13 = ax1.scatter(a0, b0, s = 100, marker = '*', color = 'darkorange')
line14 = ax1.plot([x0,a0],[y0,b0], color = 'darkorange')
line15 = ax1.text(4.2,4,'Q(x0,y0)')
line16 = ax1.text(0.6,5, 'M(a0,b0)')
line18 = plt.xlim(-5,5)
line17 = plt.ylim(0,25)
plt.savefig('C:/Users/BRIAR/Desktop/index.png')
plt.show()

The mininum distance: 1.943317035
The mininum distance: 1.9433170350024023
class ‘numpy.ndarray'

讲解Python3中NumPy数组寻找特定元素下标的两种方法

List中的index函数

Syntax: List.index(aimElement)
注意:此处需将NumPy数组转换成List格式的数据。
具体实现代码如下:

import numpy as np
import math
import matplotlib.pyplot as plt

a = np.linspace(-5, 5, 10000)
b = a * a
x0 = 4
y0 =4
num = np.linspace(0, len(a) - 1, len(a))
dis = np.linspace(0, 0, len(a))
for k in num:
  k = int(k)
  dis[k] = dis[k] + math.sqrt((a[k] -x0) **2 + (b[k] - y0) **2)
disMin = min(dis)
disList = dis.tolist()
disMinIndex = disList.index(disMin)
disMin0 = math.sqrt((a[disMinIndex] - x0) **2 + (b[disMinIndex] - y0) **2)
print('The mininum distance:',disMin)
print('The mininum distance:',disMin0)
print(type(disList))
a0 = a[disMinIndex]
b0 = b[disMinIndex]
fig = plt.figure(figsize = (6,6), dpi = 200)
ax1 = plt.subplot(1,1,1)
line11 = ax1.scatter(a,b,s = 1)
line12 = ax1.scatter(x0, y0, s = 100, marker = '*', color = 'darkorange')
line13 = ax1.scatter(a0, b0, s = 100, marker = '*', color = 'darkorange')
line14 = ax1.plot([x0,a0],[y0,b0], color = 'darkorange')
line15 = ax1.text(4.2,4,'Q(x0,y0)')
line16 = ax1.text(0.6,5, 'M(a0,b0)')
line18 = plt.xlim(-5,5)
line17 = plt.ylim(0,25)
plt.savefig('C:/Users/BRIAR/Desktop/index.png')
plt.show()

The mininum distance: 1.943317035
The mininum distance: 1.9433170350024023
class ‘list'

讲解Python3中NumPy数组寻找特定元素下标的两种方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python logging模块学习笔记
May 24 Python
跟老齐学Python之编写类之四再论继承
Oct 11 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
Python3离线安装Requests模块问题
Oct 13 Python
在python tkinter界面中添加按钮的实例
Mar 04 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 #Python
Python 实现遥感影像波段组合的示例代码
Aug 04 #Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 #Python
详解用python生成随机数的几种方法
Aug 04 #Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 #Python
python中pygame安装过程(超级详细)
Aug 04 #Python
浅谈python图片处理Image和skimage的区别
Aug 04 #Python
You might like
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
javascript常见用法总结
2014/05/22 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python中引用与复制用法实例分析
2015/06/04 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
Python递归函数实例讲解
2019/02/27 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
ktv筹备计划书
2014/05/03 职场文书
促销活动总结怎么写
2014/06/25 职场文书
服务标语口号
2014/07/01 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书