从元组数组中提取所需的索引

Extracting required indices from an array of tuples

import numpy as np
from scipy import signal

y = np.array([[2, 1, 2, 3, 2, 0, 1, 0],
             [2, 1, 2, 3, 2, 0, 1, 0]])

maximas = signal.argrelmax(y, axis=1)

print maximas

(array([0, 0, 1, 1], dtype=int64), array([3, 6, 3, 6], dtype=int64))

最大值产生了元组的索引:(0,3) 和 (0,6) 用于第一行 [2, 1, 2, 3, 2, 0, 1, 0];和 (1,6) 和 (1,6) 用于另一行 [2, 1, 2, 3, 2, 0, 1, 0].

以下打印所有结果,但我只想提取两行的第一个最大值,即使用元组的 [3,3]。所以,我需要的元组是 (0,3) 和 (1,3)。

如何从元组数组中提取它们,即 'maximas'?

>>> print y[kk]
[3 1 3 1]

好吧,纯粹的 Python 方法是使用 itertools.groupby(在行的索引上分组)和列表理解:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> [max(g, key=lambda x: y[x])
                             for k, g in groupby(zip(*maximas), itemgetter(0))]
[(0, 3), (1, 3)]

给定元组 maximas,这是一种可能的 NumPy 方式:

>>> a = np.column_stack(maximas)
>>> a[np.unique(a[:,0], return_index=True)[1]]
array([[0, 3],
       [1, 3]], dtype=int64)

这会将 signal.argrelmax 编辑的坐标列表 return 堆叠到数组 a 中。 np.uniquereturn_index参数用于查找每个行号的第一个索引。然后我们可以使用这些第一个索引从 a 中检索相关行。

这 return 是一个数组,但您可以使用 tolist().

将其转换为列表列表

到return每一行最大值的第一列索引,你只需要从maximas[0]中取出return由np.unique编辑的索引并使用它们索引 maximas[1]。在一行中,它是这样的:

>>> maximas[1][np.unique(maximas[0], return_index=True)[1]]
array([3, 3], dtype=int64)

要从 y 的每一行中检索相应的值,您可以使用 np.choose:

>>> cols = maximas[1][np.unique(maximas[0], return_index=True)[1]]
>>> np.choose(cols, y.T)
array([3, 3])