Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy矩阵,通过对每行排序将0设置为值_Python_Sorting_Numpy_Matrix - Fatal编程技术网

Python numpy矩阵,通过对每行排序将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 ,

我有一个矩阵,有许多行和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  ,  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.        ]])