假设我有一个二进制矩阵。我想将该矩阵转换为另一个矩阵,其中每行都有单个矩阵,并且该矩阵的索引对于每行都是随机的。从二进制numpy矩阵的每一行中选择随机的一个?
例如,如果其中一行是[0,1,0,1,0,0,1]
,我将它转换为[0,0,0,1,0,0,0]
,我们随机选择1的索引。
我怎么能在numpy中做到这一点?
目前我发现每行的最大值(因为max函数返回一个索引)并将其设置为零。它适用于所有行最多有2个,但如果超过2个则失败。
假设我有一个二进制矩阵。我想将该矩阵转换为另一个矩阵,其中每行都有单个矩阵,并且该矩阵的索引对于每行都是随机的。从二进制numpy矩阵的每一行中选择随机的一个?
例如,如果其中一行是[0,1,0,1,0,0,1]
,我将它转换为[0,0,0,1,0,0,0]
,我们随机选择1的索引。
我怎么能在numpy中做到这一点?
目前我发现每行的最大值(因为max函数返回一个索引)并将其设置为零。它适用于所有行最多有2个,但如果超过2个则失败。
扩展@ zhangxaochen的答案,给出一个随机二进制数组
x = np.random.random_integers(0, 1, (8, 8))
可以填充另一个用随机抽取的1个从x
:
y = np.zeros_like(x)
ind = [np.random.choice(np.where(row)[0]) for row in x]
y[range(x.shape[0]), ind] = 1
我想使用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])
你可以用'np.where(a)[0]'替换'a.argsort()[ - np.count_nonzero(a):]'。 –
@BiRico对那个丑陋的代码感到抱歉。编辑:) – zhangxaochen
为什么“Matlab”标签?你也想在Matlab中得到答案吗? –