Scipy:Argrelmax在3d数组中沿维度查找Maxmima

时间:2016-03-31 14:09:56

标签: python arrays numpy scipy

我想在第一维中找到3D数组(100,1000,1000)中的相对局部最大值。我使用scipy.signal的argrelmax函数

result = argrelmax(data, axis = 0, order = 20)

我无法真正理解输出,我期望通过我的数据量获得每个1D切片的相对最大值。相反,我得到3个元组,1653179值。我怎样才能将它们与原始形状联系起来?

1 个答案:

答案 0 :(得分:2)

argrelmax的返回值是相对最大值的数组索引。例如,

In [47]: np.random.seed(12345)

In [48]: x = np.random.randint(0, 10, size=(10, 3))

In [49]: x
Out[49]: 
array([[2, 5, 1],
       [4, 9, 5],
       [2, 1, 6],
       [1, 9, 7],
       [6, 0, 2],
       [9, 1, 2],
       [6, 7, 7],
       [7, 8, 7],
       [1, 7, 4],
       [0, 3, 5]])

In [50]: i, j = argrelmax(x, axis=0)

In [51]: i
Out[51]: array([1, 1, 3, 3, 5, 7, 7])

In [52]: j
Out[52]: array([0, 1, 1, 2, 0, 0, 1])

i包含行,j包含相对最大值的列。例如。 x[1, 0]保存值4,这是第一列中的相对最大值,x[1, 1]保存值9,这是第二列中的相对最大值。 / p>

要按列处理本地最大值列,您可以执行以下操作:

In [56]: for col in range(x.shape[1]):
   ....:     mask = j == col
   ....:     print("Column:", col, " Position of local max:", i[mask])
   ....:     
Column: 0  Position of local max: [1 5 7]
Column: 1  Position of local max: [1 3 7]
Column: 2  Position of local max: [3]

这同样适用于您的3D阵列。以下使用更小的3D阵列作为示例:

In [73]: np.random.seed(12345)

In [74]: data = np.random.randint(0, 10, size=(10, 3, 2))

In [75]: i, j, k = argrelmax(data, axis=0)

要获得切片data[:, 0, 0]中相对最大值的位置,您可以执行以下操作:

In [76]: mask00 = (j == 0) & (k == 0)

In [77]: i[mask00]
Out[77]: array([5, 8])

检查那些是本地最大值的索引:

In [78]: data[:, 0, 0]
Out[78]: array([2, 2, 6, 6, 1, 7, 3, 0, 8, 7])