Python numpy矩阵,通过对每行排序将0设置为值
我有一个矩阵,有许多行和8列。 每个单元格表示当前行属于8个类中的1个类的概率。 我想在每行中只保留2个最高值,并将其余值设置为0 到目前为止,我能想到的唯一方法是分别循环和排序每一行。 例如:Python numpy矩阵,通过对每行排序将0设置为值,python,sorting,numpy,matrix,Python,Sorting,Numpy,Matrix,我有一个矩阵,有许多行和8列。 每个单元格表示当前行属于8个类中的1个类的概率。 我想在每行中只保留2个最高值,并将其余值设置为0 到目前为止,我能想到的唯一方法是分别循环和排序每一行。 例如: a = np.array([[ 0.2 , 0.1 , 0.02 , 0.01 , 0.031, 0.11 ], [ 0.5 , 0.1 , 0.02 , 0.01 , 0.031, 0.11 ], [ 0.2 ,
a = np.array([[ 0.2 , 0.1 , 0.02 , 0.01 , 0.031, 0.11 ],
[ 0.5 , 0.1 , 0.02 , 0.01 , 0.031, 0.11 ],
[ 0.2 , 0.1 , 0.22 , 0.15 , 0.031, 0.11 ]])
我想得到:
array([[ 0.2 , 0. , 0. , 0. , 0. , 0.11],
[ 0.5 , 0. , 0. , 0. , 0. , 0.11],
[ 0.2 , 0. , 0.22, 0. , 0. , 0. ]])
谢谢,这应该行得通,但是它改变了
a
。这是你想要的吗?是否有必要避免循环
sorted = np.sort(a, axis=1)
for idx, row in enumerate(a):
row[row < sorted[idx,-2]] = 0
sorted=np.sort(a,轴=1)
对于idx,枚举(a)中的行:
行[行<已排序[idx,-2]]=0
或者你可以这样做:
a[a < sorted[:,None,-2]] = 0
a[a
这里有一种矢量化方法-
样本运行-
In [570]: a
Out[570]:
array([[ 0.94791114, 0.48438182, 0.54574317, 0.45481231, 0.94013836],
[ 0.03861196, 0.99047316, 0.7897759 , 0.38863967, 0.93659426],
[ 0.49436676, 0.93762758, 0.33694977, 0.45701655, 0.73078113],
[ 0.21240062, 0.85141765, 0.00815352, 0.52517721, 0.49752736]])
In [571]: m,n = a.shape
...: a[np.arange(m)[:,None],np.argpartition(a,n-2,axis=1)[:,:-2]] = 0
...:
In [572]: a
Out[572]:
array([[ 0.94791114, 0. , 0. , 0. , 0.94013836],
[ 0. , 0.99047316, 0. , 0. , 0.93659426],
[ 0. , 0.93762758, 0. , 0. , 0.73078113],
[ 0. , 0.85141765, 0. , 0.52517721, 0. ]])
您认为需要
a
来保持2D
形状。因此,它将是简单的a[a
,忽略连接案例。@Divakar我不得不承认,我奇怪地不知道如何使用None
进行索引,这是非常有用的知识-谢谢!我对它上瘾了!希望您能更多地使用它:)当然可以:)
In [570]: a
Out[570]:
array([[ 0.94791114, 0.48438182, 0.54574317, 0.45481231, 0.94013836],
[ 0.03861196, 0.99047316, 0.7897759 , 0.38863967, 0.93659426],
[ 0.49436676, 0.93762758, 0.33694977, 0.45701655, 0.73078113],
[ 0.21240062, 0.85141765, 0.00815352, 0.52517721, 0.49752736]])
In [571]: m,n = a.shape
...: a[np.arange(m)[:,None],np.argpartition(a,n-2,axis=1)[:,:-2]] = 0
...:
In [572]: a
Out[572]:
array([[ 0.94791114, 0. , 0. , 0. , 0.94013836],
[ 0. , 0.99047316, 0. , 0. , 0.93659426],
[ 0. , 0.93762758, 0. , 0. , 0.73078113],
[ 0. , 0.85141765, 0. , 0.52517721, 0. ]])