假设我有一个2D的numpy
数组,例如:
[[1, 8, 3, 4, 5],
[10,13,13,12,15]]
我希望将每行中除最大值或最大2个元素以外的所有元素转换为零。我希望得到的输出如下:
[[0, 8, 0,0, 5],
[0,13,13,0,15]]
我该怎么做?
假设我有一个2D的numpy
数组,例如:
[[1, 8, 3, 4, 5],
[10,13,13,12,15]]
我希望将每行中除最大值或最大2个元素以外的所有元素转换为零。我希望得到的输出如下:
[[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]])
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)
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)
这段代码仅用于识别每行中的最大值并将所有其他值替换为零。 如果您想包括前两个最高值,我认为您需要编写循环。
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]])
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
x
的RESULT
将会是这样的:
array([[ 0, 8, 0, 0, 5],
[ 0, 13, 13, 0, 15]])