2017-08-26 3 views
2

Supposons que j'ai un tableau numpymatrice de la production numpy plus clairsemée

np.array([ 
    [3, 0, 5, 3, 0, 1], 
    [0, 1, 2, 1, 5, 2], 
    [4, 3, 5, 3, 1, 4], 
    [2, 5, 2, 5, 3, 1], 
    [0, 1, 2, 1, 5, 2], 
]) 

Maintenant, je veux remplacer au hasard quelques éléments avec 0. Alors que j'ai une sortie comme celui-ci

np.array([ 
    [3, 0, 0, 3, 0, 1], 
    [0, 1, 2, 0, 5, 2], 
    [0, 3, 0, 3, 1, 0], 
    [2, 0, 2, 5, 0, 1], 
    [0, 0, 2, 0, 5, 0], 
]) 
+1

Produire un [ 'mcve'] (https://stackoverflow.com/help/mcve)? – Divakar

+0

vous pouvez exécuter ce code si vous avez l'ensemble de données MovieLens100K. Téléchargez-le ici files.grouplens.org/datasets/movielens/ml-100k.zip – partoftheorigin

+1

No. ** Vous devez fournir ** un [mcve] –

Répondre

6

Nous pouvons utilisez np.random.choice(..., replace=False) pour sélectionner aléatoirement un nombre d'index aplatis non nul uniques, puis indexez et réinitialisez simplement ceux du tableau d'entrée.

Ainsi, une solution serait -

def make_more_sparsey(a, n): 
    # a is input array 
    # n is number of non-zero elements to be reset to zero 
    idx = np.flatnonzero(a) # for performance, use np.flatnonzero(a!=0) 
    np.put(a, np.random.choice(idx, n, replace=False),0) 
    return a 

run échantillon -

In [204]: R = np.array([ 
    ...:  [3, 0, 5, 3, 0, 1], 
    ...:  [0, 1, 2, 1, 5, 2], 
    ...:  [4, 3, 5, 3, 1, 4], 
    ...:  [2, 5, 2, 5, 3, 1], 
    ...:  [0, 1, 2, 1, 5, 2], 
    ...: ]) 

In [205]: make_more_sparsey(R, n=5) 
Out[205]: 
array([[3, 0, 5, 3, 0, 1], 
     [0, 1, 0, 0, 5, 2], 
     [4, 3, 5, 3, 1, 4], 
     [2, 5, 0, 5, 3, 1], 
     [0, 1, 0, 1, 0, 2]]) 
+0

C'est très bien. – sascha

+0

@partoftheorigin Si 'R' est votre tableau d'entrée, faites simplement' np.put (R, np.random.choice (idx, n, replace = 0), 0) '. Ne faites pas: 'a = np.put (R ..)'. J'ai supposé 'a' comme le tableau d'entrée. Le résultat final serait un 'R' plus sparsey. – Divakar

+0

Merci, Divakar! – partoftheorigin

0

Utilisez np.ravel ou la méthode ravel pour créer un aplati. Notez que la méthode flatten crée toujours une copie, donc la mutation ne fonctionnera pas.

a = np.array([ 
    [3, 0, 5, 3, 0, 1], 
    [0, 1, 2, 1, 5, 2], 
    [4, 3, 5, 3, 1, 4], 
    [2, 5, 2, 5, 3, 1], 
    [0, 1, 2, 1, 5, 2], 
]) 
r = a.ravel() 
r[random.randrange(0, len(r))] = 0