最小Numpy数组忽略对角线

Erd*_*ase 8 python numpy

我必须找到忽略对角元素的numpy数组的最大值.

np.amax()提供了忽略特定轴的方法.如何忽略所有对角线元素?

hun*_*nse 19

你可以使用面具

mask = np.ones(a.shape, dtype=bool)
np.fill_diagonal(mask, 0)
max_value = a[mask].max()
Run Code Online (Sandbox Code Playgroud)

a你想要找到最大值的矩阵在哪里.掩码选择非对角元素,因此a[mask]将是所有非对角元素的长向量.然后你就拿最大值

或者,如果您不介意修改原始数组

np.fill_diagonal(a, -np.inf)
max_value = a.max()
Run Code Online (Sandbox Code Playgroud)

当然,您可以随时复制,然后在不修改原件的情况下执行上述操作.此外,这是假设这a是一些浮点格式.

  • 您也可以只使用“a[~np.eye(*a.shape, dtype=bool)].max()”。 (2认同)

xnx*_*xnx 8

另一种可能性是使用NumPy as_strided将对角线推到第一列,然后将其切掉:

In [1]: import numpy as np
In [2]: from numpy.lib.stride_tricks import as_strided
In [3]: b = np.arange(0,25,1).reshape((5,5))
In [4]: b
Out[4]: array([[ 0,  1,  2,  3,  4],
               [ 5,  6,  7,  8,  9],
               [10, 11, 12, 13, 14],
               [15, 16, 17, 18, 19],
               [20, 21, 22, 23, 24]])
In [5]: n = b.shape[0]
In [6]: np.max(as_strided(b, (n-1,n+1), (b.itemsize*(n+1), b.itemsize))[:,1:])
Out[6]: 23
Run Code Online (Sandbox Code Playgroud)

其中的参数np.max是移位视图b:

In [7]: as_strided(b, (n-1,n+1), (b.itemsize*(n+1), b.itemsize))
Out[7]: array([[ 0,  1,  2,  3,  4,  5],
               [ 6,  7,  8,  9, 10, 11],
               [12, 13, 14, 15, 16, 17],
               [18, 19, 20, 21, 22, 23]])
Run Code Online (Sandbox Code Playgroud)

以便:

In [8]: as_strided(b, (n-1,n+1), (b.itemsize*(n+1), b.itemsize))[:,1:]
Out[8]: array([[ 1,  2,  3,  4,  5],
               [ 7,  8,  9, 10, 11],
               [13, 14, 15, 16, 17],
               [19, 20, 21, 22, 23]])
Run Code Online (Sandbox Code Playgroud)

  • 哇,太酷了。可能比使用大型数组的掩码更快。 (2认同)