如何在矩阵的每一行中保持最小的非零值

  • 本文关键字:一行 非零值 python matrix
  • 更新时间 :
  • 英文 :


我有一个对称矩阵,0在对角线上:

[[0.   4.   1.25 1.25]
[4.   0.   9.25 1.25]
[1.25 9.25 0.   4.  ]
[1.25 1.25 4.   0.  ]]

我想在每行中保留最小的k非零不同值,其余的为零。例如,如果k = 1,我会有:

[[0.   0.   1.25 1.25]
[0.   0.   0.   1.25]
[1.25 0.   0.   0.  ]
[1.25 1.25 0.   0.  ]]

以下是我尝试过的:

k = 1
for i in range(matrix.shape[0]):
ind = np.argsort(matrix[i,:])
matrix[i, ind[k + 1:]] = 0

输出:

[[0.   0.   1.25 0.  ]
[0.   0.   0.   1.25]
[1.25 0.   0.   0.  ]
[0.   1.25 0.   0.  ]]

我可以在每一行中取一组值,如果它不属于该组,则将其归零,但我正在寻找一个更优雅的解决方案。

编辑:对于k = 2,所需结果为:

[[0.   4.   1.25 1.25]
[4.   0.   0.   1.25]
[1.25 0.   0.   4.  ]
[1.25 1.25 4.   0.  ]]

对于k = 3:

[[0.   4.   1.25 1.25]
[4.   0.   9.25 1.25]
[1.25 9.25 0.   4.  ]
[1.25 1.25 4.   0.  ]]

对角线上具有0的对称矩阵

对于k=1:用大值填充对角线;然后使用np.where,以行最小值为条件。

a = [[0.  , 4.  , 1.25, 1.25],
[4.  , 0.  , 9.25, 1.25],
[1.25, 9.25, 0.  , 4.  ],
[1.25, 1.25, 4.  , 0.  ]]
a = np.array(a)
np.fill_diagonal(a,a.max()+1)
cond = a == a.min(-1)
b = np.where(cond,a,0)

这与您想要的k=1的结果相匹配,但您的文本描述似乎表明您只想在每行中保留k值。


这适用于任何k
现在仍然使用for循环:在每一行中查找唯一的非零值;使用这些值中的第一个CCD_ 7来制作掩模;使用掩码将不符合的项目填充为零。

def f(a,k=1):
for row in a:
values = row[row.nonzero()]
values = np.unique(values)    #returns a sorted array
values = values[:k]
mask = (row[:,None] != values).all(1)
row[mask] = 0
return a
q = f(a,k=2)

也许不是最好的解决方案,因为你发现使用np.unique不雅。


最新更新