假設我有一個二進制矩陣。我想將該矩陣轉換爲另一個矩陣,其中每行都有單個矩陣,並且該矩陣的索引對於每行都是隨機的。從二進制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中得到答案嗎? –