Python 创建每行和每列最多包含一个值的矩阵

Python 创建每行和每列最多包含一个值的矩阵,python,numpy,Python,Numpy,从一个充满值的矩阵(见图)中,我想得到一个每行和每列最多有一个值的矩阵。如果存在多个值,则应保持最大值,并将另一个值设置为0。我知道我可以用np.max和np.argmax来实现这一点,但我想知道是否有一些我不知道的聪明方法 以下是我目前的解决方案: tmp = np.zeros_like(matrix) for x in np.argmax(matrix, axis=0): # get max on x axis for y in np.argmax(matrix, axis=1):

从一个充满值的矩阵(见图)中,我想得到一个每行和每列最多有一个值的矩阵。如果存在多个值,则应保持最大值,并将另一个值设置为0。我知道我可以用np.max和np.argmax来实现这一点,但我想知道是否有一些我不知道的聪明方法

以下是我目前的解决方案:

tmp = np.zeros_like(matrix)
for x in np.argmax(matrix, axis=0): # get max on x axis
    for y in np.argmax(matrix, axis=1): # get max on y axis
        tmp[x][y] = matrix[x][y]
matrix = tmp

稀疏结构可能用于提高效率,但是现在我发现每行和每列最多有一个值与当前实现之间存在矛盾,当前实现可能会在每行/每列中保留多个值

您需要一个顺序来选择行而不是列,或者对所有矩阵值进行绝对排序

确保每行和每列最多产生一个条目的想法是,首先选择行的最大值,然后从这个中间矩阵中选择列的最大值:

import numpy as np
rows=5
cols=5
matrix=np.random.rand(rows, cols)

rowmax=np.argmax(matrix, 1)
rowmax_matrix=np.zeros((rows, cols))
for ri, rm in enumerate(rowmax):
    rowmax_matrix[ri,rm]=matrix[ri, rm]

colrowmax=np.argmax(rowmax_matrix, 0)
colrowmax_matrix=np.zeros((rows, cols))
for ci, cm in enumerate(colrowmax):
    colrowmax_matrix[cm, ci]=rowmax_matrix[cm, ci]
这可能不是最终答案,但可能有助于精确地制定所需的算法