从元组数组中提取所需的索引
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.unique
的return_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])
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.unique
的return_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])