讲解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图像处理之颜色的定义与使用分析
Jan 03 Python
Python批量生成特定尺寸图片及图画任意文字的实例
Jan 30 Python
Python正则表达式和re库知识点总结
Feb 11 Python
python 标准差计算的实现(std)
Jul 29 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 Python
用Python远程登陆服务器的步骤
Apr 16 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
Pytest中conftest.py的用法
Jun 27 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批量生成缩略图的代码
2008/07/19 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
进一步理解Python中的函数编程
2015/04/13 Python
python多进程实现进程间通信实例
2017/11/24 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
执行力心得体会
2013/12/31 职场文书
英文导游欢迎词
2014/01/11 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
班组长竞聘书
2014/03/31 职场文书
说明书范文
2014/05/07 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
报到证办理个人委托书
2014/10/06 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
2022漫威和DC电影上映作品
2022/04/05 欧美动漫