讲解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中尝试多线程编程的一个简明例子
Apr 07 Python
简单介绍Python中的readline()方法的使用
May 24 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
详解Django-auth-ldap 配置方法
Dec 10 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
python二进制文件的转译详解
Jul 03 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Django 批量插入数据的实现方法
Jan 12 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
Python logging模块进行封装实现原理解析
Aug 07 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
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
深入解析PHP中SESSION反序列化机制
2017/03/01 PHP
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
Vue组件开发初探
2017/02/14 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
原生js代码能实现call和bind吗
2019/07/31 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
Python对象类型及其运算方法(详解)
2017/07/05 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
用python实现名片管理系统
2020/06/18 Python
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
大学校庆策划书
2014/01/31 职场文书
团队激励口号
2014/06/06 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
优秀高中学生评语
2014/12/30 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
焦裕禄观后感
2015/06/03 职场文书
运动会新闻报道稿
2015/07/22 职场文书
python套接字socket通信
2022/04/01 Python