讲解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下的Mysql模块MySQLdb安装详解
Apr 09 Python
跟老齐学Python之网站的结构
Oct 24 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
Python Socket传输文件示例
Jan 16 Python
python与php实现分割文件代码
Mar 06 Python
python发送邮件脚本
May 22 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
Python 定义只读属性的实现方式
Mar 05 Python
Python timeit模块原理及使用方法
Oct 10 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 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传输数据的代码
2007/11/13 PHP
Memcache 在PHP中的使用技巧
2010/02/08 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
仿京东快报向上滚动的实例
2017/12/13 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
Python实现的简单计算器功能详解
2018/08/25 Python
python实现动态创建类的方法分析
2019/06/25 Python
python实现可变变量名方法详解
2019/07/01 Python
优秀技术工人先进材料
2014/02/17 职场文书
大学新生军训方案
2014/05/03 职场文书
初婚初育证明范本
2014/11/24 职场文书
申报材料格式
2014/12/30 职场文书
追悼会悼词大全
2015/06/23 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
浅谈MySQL之select优化方案
2021/08/07 MySQL
java调用Restful接口的三种方法
2021/08/23 Java/Android
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB