假设我有一个2D numpy
数组,例如:
[[1, 8, 3, 4, 5],
[10,13,13,12,15]]
除了每行中最多或最多2个元素,我想将所有元素都转换为零。我想得到的输出是:
[[0, 8, 0,0, 5],
[0,13,13,0,15]]
我该怎么做?
答案 0 :(得分:2)
只有一行代码且没有循环:
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 :(得分:0)
为解决此问题,我们需要对您的数据进行排序。如果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]])
答案 2 :(得分: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)
您可以为最大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)
答案 3 :(得分:0)
此代码仅用于标识行中的最大值,并将所有其他值替换为零。 如果要包括前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]])
答案 4 :(得分:-1)
我不完全了解您要应用什么条件,但是语法为:
np.where(condition, data, 0)