使numpy 2d数组中每行中除最大n元素之外的所有元素为零

use*_*839 5 python numpy numpy-ndarray

假设我有一个二维numpy数组,如:

[[1, 8, 3, 4, 5],
 [10,13,13,12,15]]
Run Code Online (Sandbox Code Playgroud)

我想将除每行中最大或最大 2 个元素之外的所有元素都转换为零。我想得到的输出是:

[[0, 8, 0,0, 5],
 [0,13,13,0,15]]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Mar*_*ani 5

只有一行代码并且没有循环

a = np.asarray([[1, 8, 3, 4, 5],
                [10,13,13,12,15]])
n_max = 2 # second max element

a * (a >= np.sort(a, axis=1)[:,[-n_max]]).astype(int)
Run Code Online (Sandbox Code Playgroud)

输出:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])
Run Code Online (Sandbox Code Playgroud)

对列做同样的事情...

a = np.asarray([[1, 8, 3, 4, 5],
                [10,13,13,12,15],
                [6, 9, 12,7, 7],
                [3, 8, 5 ,22, 2]])
n_max = 2 # second max element

a * (a >= np.sort(a, axis=0)[[-n_max],:]).astype(int)
Run Code Online (Sandbox Code Playgroud)

输出:

array([[ 0,  0,  0,  0,  0],
       [10, 13, 13, 12, 15],
       [ 6,  9, 12,  0,  7],
       [ 0,  0,  0, 22,  0]])
Run Code Online (Sandbox Code Playgroud)


ham*_*yad -1

为了解决这个问题,我们需要对数据进行排序。如果 x 是您的 numpy 数组数据,首先我们对其进行排序。

import numpy as np
x = np.array([[1,8,3,4,5],[10,13,13,12,15]])
x.sort()
Run Code Online (Sandbox Code Playgroud)

排序后,每行仅两个最终元素显示最大值。因此,我们对另一个元素撒谎为零,并将其保存x在 中f

for i in range(0,len(x)):
    x[i][0:-2]=0
f = x
Run Code Online (Sandbox Code Playgroud)

那么,f就是:

array([[ 0,  0,  0,  5,  8],
       [ 0,  0,  0, 13, 15]])
Run Code Online (Sandbox Code Playgroud)

现在我们需要初始xf

x = np.array([[1,8,3,4,5],[10,13,13,12,15]])
Run Code Online (Sandbox Code Playgroud)

x是:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])
Run Code Online (Sandbox Code Playgroud)

最后,我们比较xf达到我们的目标:

for i in range(0,len(f)):
    for j in range(0,len(f[i])):
        if x[i][j] not in f[i]:
            x[i][j]=0
Run Code Online (Sandbox Code Playgroud)

RESULTforx将是这样的:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])
Run Code Online (Sandbox Code Playgroud)