导航:首页 > 编程语言 > python寻找峰值函数

python寻找峰值函数

发布时间:2022-08-18 11:18:14

❶ 快速查找二维数组的所有峰值,c语言实现最好,python也可以,最好能实现滤波。

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<malloc.h>
#definemaxsize6//每个波形数据最大采集个数默认6

typedefstructarray1
{
int*data;
structarray1*next;
}ARR1;
ARR1*addNewArr(ARR1*arrHead,ARR1*arrTail);//插入一组波形数据节点返回尾节点
intfindMaxF(ARR1*arrHead);//查找最大峰值
intremoveMinF(ARR1*arrHead);//移除最小峰值数据组返回最小峰值
voidprintfArr(ARR1*arrHead);//打印数据链表

intmain()
{
ARR1*arrHead=(ARR1*)malloc(sizeof(ARR1));
arrHead->next=NULL;
ARR1*arrTail=NULL;

arrTail=addNewArr(arrHead,arrTail);//想插入几组,就调用几次我就测试6组
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);

printf("采集的原数据组为: ");
printfArr(arrHead);
printf("最大峰值:%d,最小峰值值:%d ",findMaxF(arrHead),removeMinF(arrHead));
printf("删除最小峰值数据组后的数据为: ");
printfArr(arrHead);
return0;
}


voidprintfArr(ARR1*arrHead)//打印数据链表
{
while(arrHead->next!=NULL)
{
printf("%d,%d,%d,%d,%d,%d ",arrHead->next->data[0],arrHead->next->data[1],arrHead->next->data[2],arrHead->next->data[3],arrHead->next->data[4],arrHead->next->data[5]);
arrHead=arrHead->next;
}
}
ARR1*addNewArr(ARR1*arrHead,ARR1*arrTail)//插入一组波形数据返回尾节点
{
int*data=(int*)malloc(sizeof(int)*maxsize),i;
printf("采集一组波形数据(最大采集个数%d):",maxsize);
for(i=0;i<maxsize;i++)
scanf("%d",&data[i]);

ARR1*arrNew=(ARR1*)malloc(sizeof(ARR1));
arrNew->data=data;
arrNew->next=NULL;

if(arrHead->next==NULL)//插入第一组数组作为首节点
arrHead->next=arrNew;
else
arrTail->next=arrNew;

arrTail=arrNew;
returnarrTail;
}
intfindMaxF(ARR1*arrHead)//查找最大峰值
{
inti,maxNum=0,maxf=0;
while(arrHead->next!=NULL)
{
maxNum=0;
for(i=0;i<maxsize;i++)//获取每组数据的峰值
{
if(arrHead->next->data[i]>maxNum)
maxNum=arrHead->next->data[i];
}
if(maxNum>maxf)//获取最大峰值
maxf=maxNum;
arrHead=arrHead->next;
}
returnmaxf;
}
intremoveMinF(ARR1*arrHead)//移除最小峰值数据组返回最小峰值
{
inti,maxNum=0,minf=INT_MAX;
ARR1*minDataSave=NULL,*arrHeadSave=arrHead;
while(arrHead->next!=NULL)
{
maxNum=0;
for(i=0;i<maxsize;i++)//获取每组数据的峰值
{
if(arrHead->next->data[i]>maxNum)
maxNum=arrHead->next->data[i];
}
if(maxNum<minf)//获取最小峰值
{
minDataSave=arrHead->next;
minf=maxNum;
}
arrHead=arrHead->next;
}

arrHead=arrHeadSave;
//移除最小峰值数据组
while(arrHead->next!=NULL)
{
if(arrHead->next==minDataSave)//删除节点重组链表
{
arrHead->next=minDataSave->next;
minDataSave->next=NULL;
free(minDataSave->data);//释放节点内存
free(minDataSave);
break;
}
arrHead=arrHead->next;
}

returnminf;
}

❷ python分治法求二维数组局部峰值方法

python分治法求二维数组局部峰值方法
下面小编就为大家分享一篇python分治法求二维数组局部峰值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
题目的意思大致是在一个n*m的二维数组中,找到一个局部峰值。峰值要求大于相邻的四个元素(数组边界以外视为负无穷),比如最后我们找到峰值A[j][i],则有A[j][i] > A[j+1][i] && A[j][i] > A[j-1][i] && A[j][i] > A[j][i+1] && A[j][i] > A[j][i-1]。返回该峰值的坐标和值。
当然,最简单直接的方法就是遍历所有数组元素,判断是否为峰值,时间复杂度为O(n^2)
再优化一点求每一行(列)的最大值,再通过二分法找最大值列的峰值(具体方法可见一维数组求峰值),这种算法时间复杂度为O(logn)
这里讨论的是一种复杂度为O(n)的算法,算法思路分为以下几步:
1、找“田”字。包括外围的四条边和中间横竖两条边(图中绿色部分),比较其大小,找到最大值的位置。(图中的7)

2、找到田字中最大值后,判断它是不是局部峰值,如果是返回该坐标,如果不是,记录找到相邻四个点中最大值坐标。通过该坐标所在的象限缩小范围,继续比较下一个田字

3、当范围缩小到3*3时必定会找到局部峰值(也可能之前就找到了)
关于为什么我们选择的范围内一定存在峰值,大家可以这样想,首先我们有一个圈,我们已知有圈内至少有一个元素大于这个圈所有的元素,那么,是不是这个圈中一定有一个最大值?
可能说得有点绕,但是多想想应该能够理解,也可以用数学的反证法来证明。
算法我们理解后接下来就是代码实现了,这里我用的语言是python(初学python,可能有些用法上不够简洁请见谅),先上代码:
import numpy as np
def max_sit(*n): #返回最大元素的位置
temp = 0
sit = 0
for i in range(len(n)):
if(n[i]>temp):
temp = n[i]
sit = i
return sit
def dp(s1,s2,e1,e2):
m1 = int((e1-s1)/2)+s1 #row
m2 = int((e2-s1)/2)+s2 #col
nub = e1-s1
temp = 0
sit_row = 0
sit_col = 0
for i in range(nub):
t = max_sit(list[s1][s2+i], #第一排
list[m1][s2+i], #中间排
list[e1][s2+i], #最后排
list[s1+i][s2], #第一列
list[s1+i][m2], #中间列
list[s1+i][e2], #最后列
temp)
if(t==6):
pass
elif(t==0):
temp = list[s1][s2+i]
sit_row = s1
sit_col = s2+i
elif(t==1):
temp = list[m1][s2+i]
sit_row = m1
sit_col = s2+i
elif(t==2):
temp = list[e1][s2+i]
sit_row = e1
sit_col = s2+i
elif(t==3):
temp = list[s1+i][s2]
sit_row = s1+i
sit_row = s2
elif(t==4):
temp = list[s1+i][m2]
sit_row = s1+i
sit_col = m2
elif(t==5):
temp = list[s1+i][e2]
sit_row = s1+i
sit_col = m2
t = max_sit(list[sit_row][sit_col], #中
list[sit_row-1][sit_col], #上
list[sit_row+1][sit_col], #下
list[sit_row][sit_col-1], #左
list[sit_row][sit_col+1]) #右
if(t==0):
return [sit_row-1,sit_col-1]
elif(t==1):
sit_row-=1
elif(t==2):
sit_row+=1
elif(t==3):
sit_col-=1
elif(t==4):
sit_col+=1
if(sit_row<m1):
e1 = m1
else:
s1 = m1
if(sit_col<m2):
e2 = m2
else:
s2 = m2
return dp(s1,s2,e1,e2)
f = open("demo.txt","r")
list = f.read()
list = list.split("n") #对行进行切片
list = ["0 "*len(list)]+list+["0 "*len(list)] #加上下的围墙
for i in range(len(list)): #对列进行切片
list[i] = list[i].split()
list[i] = ["0"]+list[i]+["0"] #加左右的围墙
list = np.array(list).astype(np.int32)
row_n = len(list)
col_n = len(list[0])
ans_sit = dp(0,0,row_n-1,col_n-1)
print("找到峰值点位于:",ans_sit)
print("该峰值点大小为:",list[ans_sit[0]+1,ans_sit[1]+1])
f.close()

首先我的输入写在txt文本文件里,通过字符串转换变为二维数组,具体转换过程可以看我上一篇博客——python中字符串转换为二维数组。(需要注意的是如果在windows环境中split后的列表没有空尾巴,所以不用加list.pop()这句话)。有的变动是我在二维数组四周加了“0”的围墙。加围墙可以再我们判断峰值的时候不用考虑边界问题。

max_sit(*n)函数用于找到多个值中最大值的位置,返回其位置,python的内构的max函数只能返回最大值,所以还是需要自己写,*n表示不定长参数,因为我需要在比较田和十(判断峰值)都用到这个函数
def max_sit(*n): #返回最大元素的位置
temp = 0
sit = 0
for i in range(len(n)):
if(n[i]>temp):
temp = n[i]
sit = i
return sit
dp(s1,s2,e1,e2)函数中四个参数的分别可看为startx,starty,endx,endy。即我们查找范围左上角和右下角的坐标值。
m1,m2分别是row 和col的中间值,也就是田字的中间。
def dp(s1,s2,e1,e2):
m1 = int((e1-s1)/2)+s1 #row
m2 = int((e2-s1)/2)+s2 #col

依次比较3行3列中的值找到最大值,注意这里要求二维数组为正方形,如果为矩形需要做调整
for i in range(nub):
t = max_sit(list[s1][s2+i], #第一排
list[m1][s2+i], #中间排
list[e1][s2+i], #最后排
list[s1+i][s2], #第一列
list[s1+i][m2], #中间列
list[s1+i][e2], #最后列
temp)
if(t==6):
pass
elif(t==0):
temp = list[s1][s2+i]
sit_row = s1
sit_col = s2+i
elif(t==1):
temp = list[m1][s2+i]
sit_row = m1
sit_col = s2+i
elif(t==2):
temp = list[e1][s2+i]
sit_row = e1
sit_col = s2+i
elif(t==3):
temp = list[s1+i][s2]
sit_row = s1+i
sit_row = s2
elif(t==4):
temp = list[s1+i][m2]
sit_row = s1+i
sit_row = m2
elif(t==5):
temp = list[s1+i][e2]
sit_row = s1+i
sit_row = m2

判断田字中最大值是不是峰值,并找不出相邻最大值
t = max_sit(list[sit_row][sit_col], #中
list[sit_row-1][sit_col], #上
list[sit_row+1][sit_col], #下
list[sit_row][sit_col-1], #左
list[sit_row][sit_col+1]) #右
if(t==0):
return [sit_row-1,sit_col-1]
elif(t==1):
sit_row-=1
elif(t==2):
sit_row+=1
elif(t==3):
sit_col-=1
elif(t==4):
sit_col+=1
缩小范围,递归求解
if(sit_row<m1):
e1 = m1
else:
s1 = m1
if(sit_col<m2):
e2 = m2
else:
s2 = m2

return dp(s1,s2,e1,e2)
好了,到这里代码基本分析完了。如果还有不清楚的地方欢迎下方留言。
除了这种算法外,我也写一种贪心算法来求解这道题,只可惜最坏的情况下算法复杂度还是O(n^2),QAQ。
大体的思路就是从中间位置起找相邻4个点中最大的点,继续把该点来找相邻最大点,最后一定会找到一个峰值点,有兴趣的可以看一下,上代码:
#!/usr/bin/python3
def dp(n):
temp = (str[n],str[n-9],str[n-1],str[n+1],str[n+9]) #中 上 左 右 下
sit = temp.index(max(temp))
if(sit==0):
return str[n]
elif(sit==1):
return dp(n-9)
elif(sit==2):
return dp(n-1)
elif(sit==3):
return dp(n+1)
else:
return dp(n+9)
f = open("/home/nancy/桌面/demo.txt","r")
list = f.read()
list = list.replace(" ","").split() #转换为列表
row = len(list)
col = len(list[0])
str="0"*(col+3)
for x in list: #加围墙 二维变一维
str+=x+"00"
str+="0"*(col+1)
mid = int(len(str)/2)
print(str,mid)
p = dp(mid)
print (p)
f.close()
以上这篇python分治法求二维数组局部峰值方法就是小编分享给大家的全部内容了,希望能给大家一个参考

❸ python 高阶函数有哪些

1、高阶函数

变量可以指向函数,函数的参数可以接收变量,那么函数可以接收另一个函数作为参数,这种函数称为高阶函数。

(1)把函数作为实参

(2)把函数作为返回值

2、系统的内置高阶函数

(1)map函数:接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回

(2)rece函数:把一个函数作用到一个序列上,这个函数必须接收两个参数,rece把结果和序列的下一个元素做累积计算

(3)filter函数:也接收一个函数和一个序列,和map函数不同的是,filter函数把传入的函数依次作用于每个元素,然后返回返回值是True的元素

(4)sorted函数:排序函数

把用户名按照首字母不区分大小写排序

(5)sorted()函数按照关键字排序

关键字:商品个数

(6)sorted()函数按照关键字排序,用键值来查找

(7)lambda匿名函数:有时候传参数时不需要显示自定义的函数,直接传入匿名函数更方便;冒号前面的x,y表示函数参数,匿名函数不需要担心函数名的冲突,匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,再利用变量来调用函数,匿名函数也可以作为返回值返回

3、高阶函数的应用:

(1)sorted函数:

(2)sorted函数默认是从小到大排序

4、装饰器

装饰器就是用来装饰函数的:想要增加原有函数的功能,但是不希望修改原有函数的定义,在代码运行期间动态增加功能的方式

(1)此装饰器的功能:计算函数的运行时间

import functools

@functools.wraps(f) ##保留原有函数的属性

运行结果:

(2)此装饰器的功能:用户登录认证

运行结果:

(3)此装饰器的功能:认证用户的同时,显示用户的转账金额

import inspect

inspect.getcallargs()将传的参数封装为一个字典,字典的key值是形式参数,value值是实参

(4)此装饰器的功能:确保收到的每个参数都是整数,是整数就求和,否则抛出错误

(5)此装饰器的功能:给装饰器传参数,是整数和浮点数就求和

python学习网,大量的免费python视频教程,欢迎在线学习!

❹ python如何取得二维数组局部峰值


#include<stdio.h>#include<stdlib.h>#include<limits.h>#include<malloc.h>#definemaxsize6//每个波形数据最大采集个数默认6typedefstructarray1{int*data;structarray1*next;}ARR1;ARR1*addNewArr(ARR1*arrHead,ARR1*arrTail);//插入一组波形数据节点返回尾节点intfindMaxF(ARR1*arrHead);//查找最大峰值intremoveMinF(ARR1*arrHead);//移除最小峰值数据组返回最小峰值voidprintfArr(ARR1*arrHead);//打印数据链表intmain(){ARR1*arrHead=(ARR1*)malloc(sizeof(ARR1));arrHead->next=NULL;ARR1*arrTail=NULL;arrTail=addNewArr(arrHead,arrTail);//想插入几组,就调用几次我就测试6组arrTail=addNewArr(arrHead,arrTail);arrTail=addNewArr(arrHead,arrTail);arrTail=addNewArr(arrHead,arrTail);arrTail=addNewArr(arrHead,arrTail);arrTail=addNewArr(arrHead,arrTail);printf("采集的原数据组为: ");printfArr(arrHead);printf("最大峰值:%d,最小峰值值:%d ",findMaxF(arrHead),removeMinF(arrHead));printf("删除最小峰值数据组后的数据为: ");printfArr(arrHead);return0;}voidprintfArr(ARR1*arrHead)//打印数据链表{while(arrHead->next!=NULL){printf("%d,%d,%d,%d,%d,%d ",arrHead->next->data[0],arrHead->next->data[1],arrHead->next->data[2],arrHead->next->data[3],arrHead->next->data[4],arrHead->next->data[5]);arrHead=arrHead->next;}}ARR1*addNewArr(ARR1*arrHead,ARR1*arrTail)//插入一组波形数据返回尾节点{int*data=(int*)malloc(sizeof(int)*maxsize),i;printf("采集一组波形数据(最大采集个数%d):",maxsize);for(i=0;i<maxsize;i++)scanf("%d",&data[i]);ARR1*arrNew=(ARR1*)malloc(sizeof(ARR1));arrNew->data=data;arrNew->next=NULL;if(arrHead->next==NULL)//插入第一组数组作为首节点arrHead->next=arrNew;elsearrTail->next=arrNew;arrTail=arrNew;returnarrTail;}intfindMaxF(ARR1*arrHead)//查找最大峰值{inti,maxNum=0,maxf=0;while(arrHead->next!=NULL){maxNum=0;for(i=0;i<maxsize;i++)//获取每组数据的峰值{if(arrHead->next->data[i]>maxNum)maxNum=arrHead->next->data[i];}if(maxNum>maxf)//获取最大峰值maxf=maxNum;arrHead=arrHead->next;}returnmaxf;}intremoveMinF(ARR1*arrHead)//移除最小峰值数据组返回最小峰值{inti,maxNum=0,minf=INT_MAX;ARR1*minDataSave=NULL,*arrHeadSave=arrHead;while(arrHead->next!=NULL){maxNum=0;for(i=0;i<maxsize;i++)//获取每组数据的峰值{if(arrHead->next->data[i]>maxNum)maxNum=arrHead->next->data[i];}if(maxNum<minf)//获取最小峰值{minDataSave=arrHead->next;minf=maxNum;}arrHead=arrHead->next;}arrHead=arrHeadSave;//移除最小峰值数据组while(arrHead->next!=NULL){if(arrHead->next==minDataSave)//删除节点重组链表{arrHead->next=minDataSave->next;minDataSave->next=NULL;free(minDataSave->data);//释放节点内存free(minDataSave);break;}arrHead=arrHead->next;}returnminf;}

❺ python数组有多个最大值,寻找最后一个最大值

用np.where函数或者用列表表达式就可以满足你的要求(见图)

❻ 用python求解函数的极值,求实现代码

python有个符号计算的库叫sympy,可以直接用这个库求导数然后解导数=0的方程,参考代码如下:
from sympy import *

x = symbols('x')
y = (x-3)**2+2*sin(x)-3*x+1
eq = diff(y, x)
solve(eq, x)

❼ 寻找峰值的函数怎么写 python语言

峰值就是一堆数值中的最大值或者最小值吧,你可以使用max和min函数。

l=[1,4,5,6,74,23,2,1,5,7]
printmax(l)
printmin(l)

如果解决了您的问题请采纳!
如果未解决请继续追问

❽ 在python中如何求解函数在定义域内的最大值如f(x)=-2x^2-8x+3在[-5,5]区间内的最大值

(1)由表中可知f(x)在(0,2]为减函数,
[2,+∞)为增函数,并且当x=2时,f(x)min=5.
(2)证明:设0<x1<x2≤2,
因为f(x1)-f(x2)=2x1+
8
x1
-3-(2x2+
8
x2
-3)=2(x1-x2)+
8(x2?x1)
x1x2
=
2(x1?x2)(x1x2?4)
x1x2

因为0<x1<x2≤2,所以x1-x2<0,0<x1x2<4,即x1x2-4<0,
所以f(x1)-f(x2)>0,即f(x1)>f(x2),所以f(x)在(0,2]为减函数.
(3)由(2)可证:函数f(x)=2x+
8
x
-3在区间(0,2]上单调递减,在区间[2,+∞)上单调递增.
则①当0<a<2时,(0,a]?(0,2],所以函数f(x)=2x+
8
x
-3在区间(0,a]上单调递减,
故f(x)min=f(a)=2a+
8
a
-3.
②当a≥2时,函数f(x)=2x+
8
x
-3在区间(0,2]上单调递减,[2,a]上单调递增,
故f(x)min=f(2)=5.
综上所述,函数f(x)=2x+
8
x
-3在区间(0,a]上的最小值为 g(a)=

2a+
8
a
?3,0<a<2

5,a≥2

❾ python 寻找曲线的峰值 谷值

a=[x,x,x,x,x,x,x]
h=[]
l=[]
foriinrange(1,len(a)-1):
if(a[i-1]<a[i]anda[i+1]<a[i]):
h.append(a[i])
elif(a[i-1]>a[i]anda[i+1]>a[i]):
l.append(a[i])
if(len(h)==0):
h.append(max(a))
if(len(l)==0):
l.append(min(a[a.index(max(a)):]))
printh
printl

❿ python函数组求各个极值的问题

你把遍历的结果放到一个列表里面,便利结束后求列表里的最大值就行了

ls=[]
foriinrange(xxx):
ls.append(func)
max_value=max(ls)
阅读全文

与python寻找峰值函数相关的资料

热点内容
随车拍app绑定什么设备 浏览:895
方维团购系统源码 浏览:990
linux反弹shell 浏览:156
打印机接口加密狗还能用吗 浏览:299
二板股票源码 浏览:446
度人经pdf 浏览:902
怎么配置android远程服务器地址 浏览:960
java程序员看哪些书 浏览:943
什么app可以免费和外国人聊天 浏览:797
pdf手写笔 浏览:182
别永远伤在童年pdf 浏览:990
爱上北斗星男友在哪个app上看 浏览:421
主力散户派发源码 浏览:671
linux如何修复服务器时间 浏览:61
荣县优途网约车app叫什么 浏览:479
百姓网app截图是什么意思 浏览:229
php如何嵌入html 浏览:817
解压专家怎么传输 浏览:745
如何共享服务器的网络连接 浏览:136
程序员简易表白代码 浏览:170