获取嵌套列表中的最大值索引

时间:2014-04-02 23:45:32

标签: python list numpy max

我有一个由a子列表组成的嵌套列表N,每个子列表都填充了M个浮点数。我有办法使用numpy获取最大浮点数的索引,如下面的MWE所示:

import numpy as np

def random_data(bot, top, N):
    # Generate some random data.
    return np.random.uniform(bot, top, N)

# Generate nested list a.
N, M = 10, 7  # number of sublists and length of each sublist
a = np.asarray([random_data(0., 1., M) for _ in range(N)])

# x,y indexes of max float in a.
print np.unravel_index(a.argmax(), a.shape)

请注意,我使用子列表索引和浮点索引作为x,y坐标,其中x是子列表的索引,y所述子列表中的浮点索引。

我现在需要的是找到最大浮点施加某些边界的坐标/索引的方法。例如,我想获取x,y[3:5]范围内x[2:6]y范围内最大浮点数的a值。

这意味着我想在[3:5]中搜索最大的浮点数,但将搜索限制在[2:6]中的那些子列表中,并在这些子列表中将其限制为print np.unravel_index(a[3:5].argmax(), a[3:5].shape) 中的浮点数。

我可以使用:

x

限制y中的范围,但返回的索引是移位,因为列表被切片,而且我认为无法通过这种方式获取{{1}}索引

2 个答案:

答案 0 :(得分:1)

您可以将'a'转换为矩阵,这样您就可以轻松地对行和列进行索引。从那里,相同的基本命令用于获取受限制的索引。然后,您可以将限制索引的开头添加到结果中,以便根据整个矩阵来获取它们。

local_inds = np.unravel_index(A[3:5,2:6].argmax(),A[3:5,2:6].shape)
correct_inds = np.asarray(local_inds) + np.asarray([3,2])

如果您有更复杂的索引限制,这将无效。如果您有要限制的x和y索引列表,则可以执行以下操作:

idx = [1,2,4,5,8]
idy = [0,3,6]
# make the subset of the data
b = np.asarray([[a[x][y] for y in idy] for x in idx])
# get the indices in the restricted data
indb = np.unravel_index(b.argmax(), b.shape)
# convert them back out
inda = (idx[indb[0]],idy[indb[1]])

答案 1 :(得分:1)

另一种解决方案是将范围外的值设置为np.inf

import numpy as np

# Generate nested list a.
N, M = 10, 7  # number of sublists and length of each sublist
a = np.random.rand(N, M)

# x,y indexes of max float in a.
print np.unravel_index(a.argmax(), a.shape)

A = np.full_like(a, -np.inf)  # use np.inf if doing np.argmin
A[3:5, 2:6] = a[3:5, 2:6]
np.unravel_index(A.argmax(), A.shape)