Numpy:在 ndarray 的每一行中查找第二大值的索引

Pep*_*per 2 python numpy numpy-ndarray

我有一个[10,10] numpy.ndarray. 我试图让索引成为每一行中第二大的数字。所以对于数组:

[101   0   1   0   0   0   1   1   2   0]
[  0 116   1   0   0   0   0   0   1   0]
[ 1  4 84  2  2  0  2  4  6  1]
[ 0  2  0 84  0  6  0  2  3  0]
[ 0  0  1  0 78  0  0  2  0 11]
[ 2  0  0  1  1 77  5  0  2  0]
[ 1  2  1  0  1  2 94  0  1  0]
[ 0  1  1  0  0  0  0 96  0  4]
[ 1  5  4  3  1  3  0  1 72  4]
[ 0  1  0  0  3  2  0  7  0 82]
Run Code Online (Sandbox Code Playgroud)

预期结果: [8, 2, 8, 5, 9, ...]

有什么建议?

S3D*_*DEV 5

惊人的numpy.argsort()功能使这项任务变得非常简单。找到排序索引后,获取倒数第二列。

m = np.array([[101,   0,   1,   0,   0,   0,   1,   1,   2,   0],
              [  0, 116,   1,   0,   0,   0,   0,   0,   1,   0],
              [  1,   4,  84,   2,   2,   0,   2,   4,   6,   1],
              [  0,   2,   0,  84,   0,   6,   0,   2,   3,   0],
              [  0,   0,   1,   0,  78,   0,   0,   2,   0,  11],
              [  2,   0,   0,   1,   1,  77,   5,   0,   2,   0],
              [  1,   2,   1,   0,   1,   2,  94,   0,   1,   0],
              [  0,   1,   1,   0,   0,   0,   0,  96,   0,   4],
              [  1,   5,   4,   3,   1,   3,   0,   1,  72,   4],
              [  0,   1,   0,   0,   3,   2,   0,   7,   0,  82]])

# Get index for the second highest value.
m.argsort()[:,-2]
Run Code Online (Sandbox Code Playgroud)

输出:

array([8, 8, 8, 5, 9, 6, 5, 9, 1, 7], dtype=int32)
Run Code Online (Sandbox Code Playgroud)