code: def from_id_gaussian_draw(cls,pst,num_reals):
          
          # set up some column names
          real_names = np.arange(num_reals,dtype=np.int64)
          #arr = np.empty((num_reals,len(pst.obs_names)))
          obs = pst.observation_data
          stds = {name:1.0/obs.loc[name,"weight"] for name in pst.nnz_obs_names}
          nz_names = set(pst.nnz_obs_names)
          arr = np.random.randn(num_reals,pst.nobs)
          for i,oname in enumerate(pst.obs_names):
              if oname in nz_names:
                  arr[:,i] *= stds[oname]
              else:
                  arr[:,i] = 0.0
          df = pd.DataFrame(arr,index=real_names,columns=pst.obs_names)
          df.loc[:,pst.obs_names] += pst.observation_data.obsval
          new_oe = cls.from_dataframe(pst=pst,df=df)
          return new_oe
docs: this is an experiemental method to help speed up independent draws
          for a really large (>1E6) ensemble sizes.
  
          Parameters
          ----------
          pst : pyemu.Pst
              a control file instance
          num_reals : int
              number of realizations to draw
  
          Returns
          -------
              ObservationEnsemble : ObservationEnsemble