2015-08-24 13 views
7

numune numpy dizi oluşturma Rastgele NaN'ler, test amacıyla rasgele yerleştirilir NaN'ler

import numpy as np 

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

A[mask] = np.nan 
bir mask c ile gerçek elemanları yaratmak sorunlarım

yerleştirilmiş c ile M by N numpy dizi oluşturmak için istiyorum ya da bu doğrudan endekslerle yapılabilir mi? Eğer maske oluşturmak için yeni dizisinde np.random.shuffle kullanabilirsiniz

cevap

6

Sen random selection without replacement için isteğe bağlı replace=False ile np.random.choice kullanmak ve düzleştirilmiş üzerinde olanlar kullanabilirsiniz: vermektedir

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 

(

A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan 
( .ravel() ile bitti) sürümü

Numune çalışma - ya sizinki ya

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, bu benim yolumdan biraz daha zarif! – tom

+0

Ayrıca uygulama için np.random.choice' np.random.randint (0, yüksek = A.size, size = c) 'ile de değiştirebilirim (değiştirme gerçekten önemli değil). Ancak, ravel() 'den sonra dizi neden düz kalmıyor? – Oleg

+0

@OlegKomarov 'np.random.randint' tekrarlanan indeksleri verebilir, bu yüzden sizin durumunuzda işe yarayacağını düşünmüyorum. '.ravel()' şeyiyle ilgili olarak, bu yalnızca bir ['' '' '' '' '' '' '' (http://stackoverflow.com/questions/4370745/view-onto-a-numpy-dizisi) 'dır, yani bellekte tam olarak düzleşmiyor. Yani, "düzleştirilmiş görünüm" bir 2D dizi olarak tutulurken, dizinlenir ve NaN olarak ayarlanır. – Divakar

4

:

[[ 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

Fena değil! Değişmeden rastgele seçim için google araması yapmalıydım ve "random_choice" in bu isteğe bağlı "replace" argümanına sahip olduğunu öğrendim, işe yaradı! :) – Divakar

İlgili konular