[英]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.