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的索引。
- 随机洗牌这些指数。
- 仅保留前两个索引(改组后),然后将其余的索引设置为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)