Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中获取矩阵数组中最大值的最佳方法_Python_Python 3.x_Sorting - Fatal编程技术网

在python中获取矩阵数组中最大值的最佳方法

在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], ] 请注意,我

我需要检查数组的最大值,但在我的情况下,需要花费很长时间:

我的数组有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],
]
请注意,我的数组是像素的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