将NumPy 2D数组中每行除最大的n个元素以外的所有元素设为零

5

假设我有一个2D的numpy数组,例如:

[[1, 8, 3, 4, 5],
 [10,13,13,12,15]]

我希望将每行中除最大值或最大2个元素以外的所有元素转换为零。我希望得到的输出如下:

[[0, 8, 0,0, 5],
 [0,13,13,0,15]]

我该怎么做?

4个回答

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)

输出:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])

使用相同的方法来处理列...

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)

输出:

array([[ 0,  0,  0,  0,  0],
       [10, 13, 13, 12, 15],
       [ 6,  9, 12,  0,  7],
       [ 0,  0,  0, 22,  0]])

1
@user2955839,这是截至2020年最正确和最快的解决方案! - PolarBear10
1
你能否请展示如何获取列的最大值呢? :) - PolarBear10
1
@MH 我已经做了,逻辑是一样的。 - Marco Cerliani

0
def func(x):
    x[np.argwhere(x != x.max())] = 0
    return x

arr = np.array([[1, 8, 3, 4, 5],
               [10,13,13,12,15]])

new_arr = np.apply_along_axis(func,  1, arr)

您可以修改函数“func”以获取最大的 2 个数字。上面的代码段将每行中除最大值外的所有元素替换为 0。
更新:要在最大的 n 个元素中执行此操作,您可以在 apply 中使用以下函数。
n = 2
def func(x):
    global n
    idx = (-x).argsort()[n:]
    x[idx] = 0
    return x

arr = np.array([[1, 8, 3, 4, 5],
               [10,13,13,12,15]])

new_arr = np.apply_along_axis(func,  1, arr)

0

这段代码仅用于识别每行中的最大值并将所有其他值替换为零。 如果您想包括前两个最高值,我认为您需要编写循环。

   import numpy as np
   import copy

   a = np.array([[1, 8, 3, 4, 5],
     [10,13,13,12,15]])

   b = copy.deepcopy(a)

a == np.max(a)将来会引发错误,因此这里有一个调整过的版本,可以继续正确地广播。

# get max by row and convert from (n, ) -> (n, 1) which will broadcast
row_maxes = a.max(axis=1).reshape(-1, 1)

如果需要进行原地更新,您可以这样做

a[:] = np.where(a == row_maxes, row_maxes, 0)

>> a
 array([[ 0,  8,  0,  0,  0],
           [ 0,  0,  0,  0, 15]])

您可以识别每行中的最大值,并应用for循环来获得所需的结果。

b = np.sort(b)
max_two = np.array(list(map(lambda row : row[-2:], b)))

for i, row in enumerate(a):
   for j, elm in enumerate(row):
      if elm not in max_two:
         a[i][j] = 0

>> a
array([[ 0,  8,  0,  0,  5],
       [ 0,  13,  13,  0, 15]])

-1
为了解决这个问题,我们需要对数据进行排序。如果x是您的numpy数组数据,首先我们要对它进行排序。
import numpy as np
x = np.array([[1,8,3,4,5],[10,13,13,12,15]])
x.sort()

在排序后,每行仅显示最大值的两个最终元素。因此,我们将零值用于其他元素,并将x保存在f中。

for i in range(0,len(x)):
    x[i][0:-2]=0
f = x

那么,f 是:

array([[ 0,  0,  0,  5,  8],
       [ 0,  0,  0, 13, 15]])

现在我们需要初始的xf

x = np.array([[1,8,3,4,5],[10,13,13,12,15]])

x 是:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])

最后,我们比较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

xRESULT将会是这样的:

array([[ 0,  8,  0,  0,  5],
       [ 0, 13, 13,  0, 15]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接