code: def draw(self,cov,num_reals=1,names=None):
          
          real_names = np.arange(num_reals,dtype=np.int64)
  
          # make sure everything is cool WRT ordering
          if names is not None:
              vals = self.mean_values.loc[names]
              cov = cov.get(names)
          elif self.names != cov.row_names:
              names = get_common_elements(self.names,
                                          cov.row_names)
              vals = self.mean_values.loc[names]
              cov = cov.get(names)
          else:
              vals = self.mean_values
              names = self.names
  
          # generate random numbers
          if cov.isdiagonal: #much faster
              val_array = np.array([np.random.normal(mu,std,size=num_reals) for\
                                    mu,std in zip(vals,np.sqrt(cov.x))]).transpose()
          else:
              val_array = np.random.multivariate_normal(vals, cov.as_2d,num_reals)
  
          self.loc[:,:] = np.NaN
          self.dropna(inplace=True)
  
          # this sucks - can only set by enlargement one row at a time
          for rname,vals in zip(real_names,val_array):
              self.loc[rname, names] = vals
              # set NaNs to mean_values
              idx = pd.isnull(self.loc[rname,:])
              self.loc[rname,idx] = self.mean_values[idx]
docs: draw random realizations from a multivariate
              Gaussian distribution
  
          Parameters
          ----------    
          cov: pyemu.Cov
              covariance structure to draw from
          num_reals: int
              number of realizations to generate
          names : list
              list of columns names to draw for.  If None, values all names
              are drawn