将numpy数组中每行中除max n元素外的所有元素设为零

2024-04-25 09:16:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想把所有的元素都转换成零,除了每行最多2个元素。我想得到的结果是:

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

我该怎么做?你知道吗


Tags: numpy元素数组
3条回答
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)

您可以修改最大2个数字的函数“func”。上面的代码段将所有元素替换为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)

为了解决这个问题,我们需要对您的数据进行排序。如果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

RESULT对于x将是这样的:

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

此代码仅用于标识行中的最大值,并将所有其他值替换为零。 如果你想写最高值的循环,我就写最高值的循环。你知道吗

   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最大值(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]])

您可以从每行中标识max 2并应用循环以获得所需的结果。你知道吗

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]])

相关问题 更多 >