我有一个由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}}索引
答案 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)