uvv=np.array([[1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, ],
              [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, ],
              [1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, ],
              [0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, ]])

根据上述矩阵,我想随机在每行中只保留两个值1的值。

目标:

 uvv=np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ],
               [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, ],
               [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, ],
               [0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, ]])

我当前的编码只能在每行中保持1个。我怎样才能解决这个问题?还是你有什么想法?

uvv*=np.cumsum(uvv,axis=1)==1

谢谢

分析解答

要修改矩阵,以使每行只保留两次1的出现,您可以按照以下步骤操作:

  1. 对于每一行,找到值为1的索引。
  2. 随机洗牌这些指数。
  3. 仅保留前两个索引(改组后),然后将其余的索引设置为0。

这是您可以使用numpy在Python中实现此功能的方法:

import numpy as np

uvv = np.array([[1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, ],
               [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, ],
               [1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, ],
               [0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, ]])

for row in uvv:
    ones_idx = np.where(row == 1)[0]
    np.random.shuffle(ones_idx)
    keep_idx = ones_idx[:2]
    row[:] = 0
    row[keep_idx] = 1

print(uvv)