繁体   English   中英

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

[英]How to keep smallest non-zero value(s) in each row of a 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 循环:在每一行中找到唯一的非零值; 使用这些值中的前k来制作掩码; 使用掩码用零填充不符合项。

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 不优雅。


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM