在python中获取矩阵数组中最大值的最佳方法
我需要检查数组的最大值,但在我的情况下,需要花费很长时间: 我的数组有3个值: 十、 Y,值在python中获取矩阵数组中最大值的最佳方法,python,python-3.x,sorting,Python,Python 3.x,Sorting,我需要检查数组的最大值,但在我的情况下,需要花费很长时间: 我的数组有3个值: 十、 Y,值 [ [1,1,36], [1,2,36.5], [1,3,36.5], [1,4,36.5], [1,5,36.5], [2,1,36.5], [2,2,36.5], [2,3,36.5], [2,4,36.5], [2,5,36.5], [3,1,36.5], [3,2,36.5], [3,3,36.5], [3,4,36.5], [3,5,36.5], ] 请注意,我
[
[1,1,36],
[1,2,36.5],
[1,3,36.5],
[1,4,36.5],
[1,5,36.5],
[2,1,36.5],
[2,2,36.5],
[2,3,36.5],
[2,4,36.5],
[2,5,36.5],
[3,1,36.5],
[3,2,36.5],
[3,3,36.5],
[3,4,36.5],
[3,5,36.5],
]
请注意,我的数组是像素的x,y值,最后一个信息是它的浮点值
但这只是我的一个小例子。我的真实情况是,我的阵列中将有30万个iTen。
我想得到起点x,y和终点x,y点内的最大值
我为
函数做了一个,但执行起来需要很长时间
有人能帮我吗
#
我有另一个数组,现在我需要得到最高的值
其中我只有[x,y]
值,要获得温度,我必须:
value = image_data[x,y]
在下面DarrylG的例子中,我不知道如何改变它以这种方式工作
我试图改变这一行
return max(lst[index_lo:index_hi+1], key=lambda item: item[2])
到
但是它不起作用。假设1
由于使用{}没有意义,我假设您的值为:
my_lst = [
[1,1,36],
[1,2,36.5],
[1,3,36.5],
[1,4,36.5],
[1,5,36.5],
[2,1,36.5],
[2,2,36.5],
[2,3,36.5],
[2,4,36.5],
[2,5,36.5],
[3,1,36.5],
[3,2,36.5],
[3,3,36.5],
[3,4,36.5],
[3,5,36.5],
]
假设2
前两个值(即X,Y)按升序排列(如示例数据中所示)
假设3
根据您的评论,您试图解决的真正问题是在有限的(X,Y)值范围内找到最大值
解决方案
我们不能简单地使用():
因为这会在整个列表中查找具有最大值的元组。我们想找到子列表上的最大值
我们需要一种快速的方法来找到元组列表中的开始和停止索引
子列表由(X,Y)开始/停止位置的索引指定,例如:开始:(2,1),结束:(3,4)
我们使用允许二进制搜索来查找开始和停止索引的方法
from bisect import bisect_left
class KeyList(object):
# bisect doesn't accept a key function, so we build the key into our sequence.
def __init__(self, l, key):
self.l = l
self.key = key
def __len__(self):
return len(self.l)
def __getitem__(self, index):
return self.key(self.l[index])
def find_max(lst, lo, hi):
" Finds max within sublist of lo to hi tuples "
# Binary search to find index of lo and hi pixel tuples
index_lo = bisect_left(KeyList(lst, lambda y: (y[0], y[1])), start)
index_hi = bisect_left(KeyList(lst, lambda y: (y[0], y[1])), finish)
# Use slice to get sublist
# Max based upon key which uses 3rd element of tuples
return max(lst[index_lo:index_hi+1], key=lambda item: item[2])
用法
print(find_max(my_lst, (2,1), (3,4)))
输出
[2, 1, 36.5]
((3, 1), 15) # row 3, column 1 with value 15
附加问题
在您的附加问题中,数据实际上是一个二维阵列或点栅格
对于这种类型的数据,我们不需要二进制搜索来查找数据的开始和结束位置
def find_max_grid(lst, lo, hi):
" Find max within a 2d array given starting and stopping tuples "
def max_with_index(row):
" Finds max in a row "
return max(enumerate(row), key=lambda v: v[1])
r1, c1 = lo # Starting row & column
r2, c2 = hi # Ending row & column
max_row, max_col, max_val = -1, -1, 0 # Initial
for r, row in enumerate(lst[r1:r2+1], start = r1):
if r == r1:
index, val = max_with_index(row[c1:])
elif r == r2:
index, val = max_with_index(row[:c2+1])
else:
index, val = max_with_index(row)
if val > max_val:
max_row = r
max_col = index
max_val = val
return (max_row, max_col), max_val
用法
输出
[2, 1, 36.5]
((3, 1), 15) # row 3, column 1 with value 15
请提供您使用的代码?那么我们可以看看如何改进?其次,您使用了大括号“{”作为我们希望看到的方括号“[”,请编辑或向我们提供有关您的数据类型的更多信息。您的意思是使用“[]”而不是“{}”,所以“[[1,1,36],[1,2,36.5],[1,3,36.5],[1,4,36.5],[1,5,36.5],[2,2,36.5],[2,4,36.5],[2,3,36.5],[2,5],[3,36.5],[2,3,36.5],[3,5],[3,3,36.5],[3,4,36.5],[3,5,36.5],]'的数据?请给我们:正确格式的预期输入和输出,或者说,数据结构,而不是类似的东西。类似的东西,{1,2,3}
,在Python中称为set
,它是一个无序的集合,具有唯一的元素。这不是您真正的数据结构。但我需要验证从x开始的最大值,y如2,1到x结束的最大值,y 3,4@JasarOrion--你能用这个标准更新你的问题吗?@JasarOrion--我更新了我的答案以反映你的评论。这就是你的意思吗?如果我只有一个数组x,y,它的值是温度,我怎么能改变这个代码呢?value=image\u data[x,y]
@JasarOrion--我不知道我是否理解。image\u data是一个二维数组,它的值对应于一个图像,x,y对应于二维图像中的像素坐标吗?
((3, 1), 15) # row 3, column 1 with value 15