假设我有一个二进制矩阵。我想将该矩阵转换为另一个矩阵,其中每一行都有一个,每一行的索引对于每一行都是随机的。
例如,如果其中一行为[0,1,0,1,0,0,1]
,我将其转换为[0,0,0,1,0,0,0]
,我们随机选择1的索引。
我怎么能在numpy中做到这一点?
现在我找到每行的max(因为max函数返回一个索引)并将其设置为零。如果所有行最多只有2个但如果超过2则失败,那么它可以工作。
答案 0 :(得分:3)
扩展@ zhangxaochen的答案,给出一个随机二进制数组
x = np.random.random_integers(0, 1, (8, 8))
您可以使用x
中随机抽取的1来填充另一个数组:
y = np.zeros_like(x)
ind = [np.random.choice(np.where(row)[0]) for row in x]
y[range(x.shape[0]), ind] = 1
答案 1 :(得分:2)
我想使用np.argsort
来获取非零元素的索引:
In [351]: a=np.array([0,1,0,1,0,0,1])
In [352]: from random import choice
...: idx=choice(np.where(a)[0]) #or np.nonzero instead of np.where
In [353]: b=np.zeros_like(a)
...: b[idx]=1
...: b
Out[353]: array([0, 1, 0, 0, 0, 0, 0])