python 找出数组中的最大值,python数组里找最大值
如果我想要列表中的最大值,我可以写max(List),但是如果我还需要最大值的索引呢?
我可以这样写:
最大值=0
对于I,枚举(列表)中的值:
如果值最大:
最大值=值
指数=i
但是在我看来很无聊。
如果我写:
List.index(max(List))
然后它将遍历列表两次。
有没有更好的办法?
你说‘它会遍历列表两次’是什么意思?List.index(max(List))适合我。
@mwc:它会迭代一次列表确定最大值,然后再迭代一次找到那个值的索引。
如果有重复的最大值,list.index()会不会有问题?
@LoganYang是的,可能有两个项目的值相同。
如果顺序不重要,可以做类似List.sort()[-1]的东西
我觉得公认的答案很好,但为什么不明确地做呢?我想更多的人会理解你的代码,这和人教版8是一致的:
最大值=最大值(我的列表)
max _ index=my _ list . index(max _ value)
这种方法也比公认的答案快三倍:
随机导入
从日期时间导入日期时间
进口经营者
定义显式(l):
max_val=max(l)
max_idx=l.index(max_val)
返回max_idx,max_val
def隐式(l):
max_idx,max_val=max(enumerate(l),key=operator.itemgetter(1))
返回max_idx,max_val
if __name__==__main__ :
从timeit导入计时器
t=Timer(explicit(l), from __main__ import explicit,implicit
导入随机;导入运算符;
l=[random . random()for _ in xrange(100)]
print explicit:% . 2f usec/pass %(1000000 * t . time it(number=100000)/100000)
t=Timer(implicit(l), from __main__ import explicit,implicit;
导入随机;导入运算符;
l=[random . random()for _ in xrange(100)]
print implicit:% . 2f usec/pass %(1000000 * t . time it(number=100000)/100000)
在我的电脑上运行的结果:
显式:8.07微秒/通道
隐式:22.86微秒/通道
其他包:
显式:6.80微秒/通道
隐式:19.01微秒/通道
没想到会更快。即使我用 L=[random . random()for _ in xrange(1000000)][2]来代替L,也更快,保证了最后一个元素最大。
@平原小懒猪88:对于简单的数字列表,简单的方法比较快。如果您在这种情况下做得很好,我建议使用numpy.argmax(),它在我的机器上快30倍。如果列表中包含比简单数字更复杂的对象,我的答案中的方法可以变得更快。这种方法的另一个优点是它可以用于任何迭代器,而不仅仅是列表。
@ Sven-Marnach如果我必须先把我的列表转换成一个numpy数组,numpy会更快吗?简单的[0,1,0]的例子会更快吗?
@Sven-Marnach我刚查过。Numpy.argmax是目前最慢的方法。如果数组包含的是字符串而不是浮点数或整数,就会给出错误的答案。
如果有重复的最大值,list.index()会不会有问题?
@LoganYang我不这么认为。当有多个最大值时,max()只返回第一个(这是Python 3保证的),list.index()也返回第一个。
有许多选项,例如:
进口经营者
index,value=max(enumerate(my_list),key=operator.itemgetter(1))
啊,我在别的地方见过这个,但是我觉得它只返回一个值,不是元组。
@平淡小懒猪88:key函数只是用来决定哪个元素最大。元素不会改变。
@SvenMarnach为什么不用key=lambda e: e[1]避免导入?
@lifebalance用itemgetter()更快,避免导入并不是一个值得追求的目标。在某些情况下,避免外部依赖是值得的,但从标准库导入不是问题。
这个回答比@Escualo快了33倍。假设列表很大,假设已经是一个np.array()。我不得不拒绝测试运行的次数,因为测试要查看10,000,000个元素,而不是仅仅100个元素。
随机导入
从日期时间导入日期时间
进口经营者
将numpy作为np导入
定义显式(l):
max_val=max(l)
max_idx=l.index(max_val)
返回max_idx,max_val
def隐式(l):
max_idx,max_val=max(enumerate(l),key=operator.itemgetter(1))
返回max_idx,max_val
def npmax(l):
max_idx=np.argmax(l)
max_val=l[max_idx]
return (max_idx,max_val)
if __name__==__main__ :
从timeit导入计时器
t=Timer(npmax(l), from __main__ import explicit,implicit,NP max;
导入随机;进口经营者;将numpy作为np导入;
l=NP . array([random . random()for _ in xrange(10000000)])
printNpmax: %.2f毫秒/通道% %(1000 * t . time it(number=10)/10)
t=Timer(explicit(l), from __main__ import explicit,implicit
导入随机;导入运算符;
l=[random . random()for _ in xrange(10000000)]
printExplicit: %.2f毫秒/遍% %(1000 * t . time it(number=10)/10)
t=Timer(implicit(l), from __main__ import explicit,implicit;
导入随机;导入运算符;
l=[random . random()for _ in xrange(10000000)]
printImplicit: %.2f毫秒/遍% %(1000 * t . time it(number=10)/10)
我电脑上的结果:
Npmax: 8.78毫秒/通道
显式:290.01毫秒/通道
隐式:790.27毫秒/通道
只是澄清一下:加速只是因为numpy C实现和纯python的比较?或者有没有办法用纯python来改进@Escualo的回答?
我不知道这有用。
如果要使用python 3.6,可以做如下操作: l=NP . array([random . random()for _ in range(1000000)]) print(f NP max:{(1000 * t)。timeit(number=10)/10):5.2f}毫秒/遍)
这是在2.7。
嗯,numpy.argmax的速度似乎很惊人,直到你让它处理一个标准的python列表。那么速度介于显式和隐式版本之间。我猜np.array不只是创建一个列表,而是会在里面保存一些额外的信息——比如最小值和最大值(只是一个假设)。
使用Python的内置库,非常简单:
a=[2,9,-10,5,18,9]
max(xrange(len(a)),key=lambda x: a[x])
这告诉max使用自定义函数lambda x: a[x]来查找列表[0,1,2,len(a)],其中0实际上是2,1实际上是9,等等。
在Python 3中,没有xrange。如果要编写同时运行Python 2和Python 3的代码,应该使用range()。
max([(v,i) for i,v in enumerate(my_list)])
这更好,因为除了元组之外,您还可以使它适用于其他事物。
这到底是怎么回事?你能打破这个过程吗?
Hi @ clabe45,它将my_list转换为tuple list (v,I),其中v是我的列表中的每一项,I是对应的索引,然后它得到值最大的元组(及其相关索引)。
谢谢你。可以在回答里发帖吗?max怎么知道计算最大值时只考虑每个元组(v)的第一项?
@ clabe45也许这个回复来得太晚了,但是现在我在这个帖子上遇到了其他人(和我一样)。这里:stackoverflow.com/questions/18296755/是一个解释。不是这行:‘默认情况下,max会比较第一个索引的项,如果第一个索引相同,就会比较第二个索引。’于是我尝试了list: l=[1,1,1]然后max([(v,I)代表I,v代表枚举(l)])。它给我的结果不是第一个而是最后一个:(1,2)。希望它说明:)
@AnupamJain现在有道理了,谢谢!
我建议一个非常简单的方法:
将numpy作为np导入
l=[10,22,8,8,11]
print(np.argmax(l))
print(np.argmin(l))
希望能帮到你。
max([(value,index) for index,value in enumerate(your _ list)])#如果最大值在列表中出现多次,则返回最后一次出现的索引
如果当前最大值不止一次,并且您想要获取所有索引,
最大值=最大值(您的列表)
maxIndexList=[index for index,value in enumerate(your _ list)if value==max(your _ list)]
没错。我差点贴了一个答案,但是后来我看到你在列表理解行也用了同样的逻辑解法。
很抱歉恢复这个帖子,但我认为我的方法值得添加。
本例中的列表名“list”
list.sort()
打印(列表[-1])
这将很容易地打印出列表中的最高值!
List.sort()根据ASCII表中项目的值对列表进行排序,因此它可以有效地从最低到最高对列表进行排序。然后我使用print(list[-1])打印列表中的最后一个值(这将是最大的数字)。
希望这能有所帮助!
我们不能这样得到指数。
也许你还需要一个排序列表?
试试这个:
your_list=[13,352,2553,0.5,89,0.4]
sorted_list=sorted(your_list)
更高值索引=你的列表索引(排序列表[-1])
尝试格式化代码,使其更具可读性。
1.排序具有较高的时间复杂度。2.sorted_list没有索引,只有值,所以不起作用。
以下是使用Python内置函数问题的完整解决方案:
#创建列表
numbers=input(输入列表中的元素。用逗号分隔每个值。不要在末尾加逗号。
).拆分(,)
#将列表中的元素(视为字符串)转换为整数
numberL=[int(element)for element in numbers]
#用for循环遍历列表
对于number 1中的元素:
maxEle=max(数字1)
index max=number 1 . index(maxEle)
打印(maxEle)
打印(最大索引)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。