使所有元素为零,除了 numpy 二维数组中每行中的最大 n 个元素
Make all the elemant zero except max n element in each row in numpy 2d-array
假设我有一个二维 numpy
数组,例如:
[[1, 8, 3, 4, 5],
[10,13,13,12,15]]
我想将所有元素转换为零,除了每行中的最大或最大 2 个元素。我想要得到的输出是:
[[0, 8, 0,0, 5],
[0,13,13,0,15]]
我该怎么做?
为了解决这个问题,我们需要对您的数据进行排序。如果 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]])
现在我们需要初始 x
和 f
:
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]])
最后,我们比较 x
和 f
是否达到我们的目标:
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]])
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 个元素进行更新,您可以在应用中使用以下函数,
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)
此代码仅用于识别行中的最大值并将所有其他值替换为零。
如果你想包含前 2 个最高值,我认为你需要编写 for 循环。
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]])
您可以从每行中最多识别出 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]])
只有一行代码,没有循环:
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]])
假设我有一个二维 numpy
数组,例如:
[[1, 8, 3, 4, 5],
[10,13,13,12,15]]
我想将所有元素转换为零,除了每行中的最大或最大 2 个元素。我想要得到的输出是:
[[0, 8, 0,0, 5],
[0,13,13,0,15]]
我该怎么做?
为了解决这个问题,我们需要对您的数据进行排序。如果 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]])
现在我们需要初始 x
和 f
:
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]])
最后,我们比较 x
和 f
是否达到我们的目标:
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]])
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 个元素进行更新,您可以在应用中使用以下函数,
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)
此代码仅用于识别行中的最大值并将所有其他值替换为零。 如果你想包含前 2 个最高值,我认为你需要编写 for 循环。
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]])
您可以从每行中最多识别出 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]])
只有一行代码,没有循环:
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]])