2015-08-24 8 views
7

Für Testzwecke, würde Ich mag einen M by N numpy Array mit c zufällig NaNs Beispiel erzeugt numpy Array mit zufällig platzierten NaNs

import numpy as np 

M = 10; 
N = 5; 
c = 15; 
A = np.random.randn(M,N) 

A[mask] = np.nan 

ich Probleme bei der Schaffung eines mask mit c wahren Elementen habe platziert zu schaffen, oder vielleicht kann das direkt mit Indizes gemacht werden?

Antwort

6

Sie np.random.choice mit dem optionalen replace=False für random selection without replacement verwenden können und die auf einem abgeflachten verwenden Version von A (erfolgt mit .ravel()), so -

A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan 

Probelauf -

In [100]: A 
Out[100]: 
array([[-0.35365726, 0.26754527, -0.44985524, -1.29520237, 2.01505444], 
     [ 0.01319146, 0.65150356, -2.32054478, 0.40924753, 0.24761671], 
     [ 0.3014714 , -0.80688589, -2.61431163, 0.07787956, 1.23381951], 
     [-1.70725777, 0.07856845, -1.04354202, -0.68904925, 1.07161002], 
     [-1.08061614, 1.17728247, -1.5913516 , -1.87601976, 1.14655867], 
     [ 1.12542853, -0.26290025, -1.0371326 , 0.53019033, -1.20766258], 
     [ 1.00692277, 0.171661 , -0.89646634, 1.87619114, -1.04900026], 
     [ 0.22238353, -0.6523747 , -0.38951426, 0.78449948, -1.14698869], 
     [ 0.58023183, 1.99987331, -0.85938155, 1.4211672 , -0.43369898], 
     [-2.15682219, -0.6872121 , -1.28073816, -0.97523148, -2.27967001]]) 

In [101]: A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan 

In [102]: A 
Out[102]: 
array([[  nan, 0.26754527, -0.44985524,   nan, 2.01505444], 
     [ 0.01319146, 0.65150356, -2.32054478,   nan, 0.24761671], 
     [  nan, -0.80688589,   nan,   nan, 1.23381951], 
     [  nan,   nan, -1.04354202, -0.68904925, 1.07161002], 
     [-1.08061614, 1.17728247, -1.5913516 ,   nan, 1.14655867], 
     [ 1.12542853,   nan, -1.0371326 , 0.53019033, -1.20766258], 
     [  nan, 0.171661 , -0.89646634,   nan,   nan], 
     [ 0.22238353, -0.6523747 , -0.38951426, 0.78449948, -1.14698869], 
     [ 0.58023183, 1.99987331, -0.85938155,   nan, -0.43369898], 
     [-2.15682219, -0.6872121 , -1.28073816, -0.97523148,   nan]]) 
+0

Oh, das ist ein bisschen eleganter als mein Weg! – tom

+0

Ich denke, ich kann 'np.random.choice' auch durch' np.random.randint (0, high = A.size, size = c) 'für meine Anwendung ersetzen (wenn der Ersatz keine Rolle spielt). Warum bleibt das Array nach 'ravel()' nicht flach? – Oleg

+0

@OlegKomarov 'np.random.randint' könnte Ihnen wiederholte Indizes geben, also glaube ich nicht, dass das in Ihrem Fall funktionieren würde. In Bezug auf das '.ravel()' Ding ist es nur ein ['view'] (http://stackoverflow.com/questions/4370745/view-onto-a-numpy-array), so dass es nicht gerade im Speicher flacht. Daher wird die "abgeflachte Ansicht" als NaNs indiziert und eingestellt, während sie als 2D-Array beibehalten wird. – Divakar

4

Sie np.random.shuffle auf einem neuen Array verwenden könnte Ihre Maske zu erstellen:

import numpy as np 

M = 10; 
N = 5; 
c = 15; 
A = np.random.randn(M,N) 

mask=np.zeros(M*N,dtype=bool) 
mask[:c] = True 
np.random.shuffle(mask) 
mask=mask.reshape(M,N) 

A[mask] = np.nan 

Welche gibt:

[[ 0.98244168 0.72121195 0.99291217 0.17035834 0.46987918] 
[ 0.76919975 0.53102064   nan 0.78776918   nan] 
[ 0.50931304 0.91826809 0.52717345   nan   nan] 
[ 0.35445471 0.28048106 0.91922292 0.76091783 0.43256409] 
[ 0.69981284 0.0620876 0.92502572   nan   nan] 
[  nan   nan   nan 0.24466688 0.70259211] 
[ 0.4916004   nan   nan 0.94945378 0.73983538] 
[ 0.89057404 0.4542628   nan 0.95547377   nan] 
[ 0.4071912 0.36066797 0.73169132 0.48217226 0.62607888] 
[ 0.30341337   nan 0.75608859 0.31497997   nan]] 
+1

auch nicht schlecht Sie entweder! Ich musste google Suche nach zufälliger Auswahl ohne Ersatz und fand, dass "random_choice" dieses optionale 'ersetzen' Argument hatte, gerade gearbeitet! :) – Divakar