[ncl-talk] Conform a multi-dimensional array to another multi-dimensional array

Giorgio Graffino g.graffino at tim.it
Mon Apr 24 06:09:22 MDT 2023


Hi Dennis,
 
Thanks for the tip, but I prefer to not create the variable beforehand. 
I used the brute-force approch on the table_attach_rows function to read 
a one-dimensional array and append it to a two-dimensional array in a 
specific index. Probably it won't work with patterns becasue I removed 
the metadata part.
 
undef("table_attach_singlerow")
function table_attach_singlerow (t1[*][*], t2[*], nind:integer)
local dim_t1, dim_t2, ncol1, ncol2, nrow1,    \
     dimNames_t1, dimNames_t2, dimNames, n
; ******************************************************************
; Attaches/appends additional 1-D row.
; Adapted from the function table_attach_rows
; 
(https://github.com/NCAR/ncl/blob/develop/ni/src/examples/gsun/contributed.ncl).
; ******************************************************************
begin
                                  ; get array shape/sizes
 dim_t1  = dimsizes(t1)
 dim_t2  = dimsizes(t2)
 ncol1   = dim_t1(1)
 ncol2   = dim_t2(0)
;  if (ncol1.ne.ncol2) then
;      print ("table_attach_rows: tables must have same number of 
columns")
;      print ("                    ncol1="+ncol1)                       
              
;      print ("                    ncol2="+ncol2)                       
              
;      exit
;  end if
 if (typeof(t1).ne.typeof(t2)) then
     print ("table_attach_rows: arrays must be of the same type")
     print ("                    typeof(t1)="+typeof(t1)) 
     print ("                    typeof(t2)="+typeof(t2)) 
     exit
 end if
                                  ; allocate space for new array
 nrow1       = dim_t1(0)
                                  ; chk _FillValue stuff
 if (isatt(t1,"_FillValue") ) then
     tNew = new ( (/nrow1+1, ncol1/), typeof(t1), t1 at _FillValue)
 else if (isatt(t2,"_FillValue") ) then
          tNew = new ( (/nrow1+1, ncol1/), typeof(t2), t2 at _FillValue)
      else 
          tNew = new ( (/nrow1+1, ncol1/), typeof(t2), "No_FillValue")
      end if
 end if
                                ; insert values
 tNew(0:nind-1,:)  = (/ t1(0:nind-1,:) /)
 tNew(nind    ,:)    = (/ t2 /)
 tNew(nind+1:,:)   = (/ t1(nind:,:) /)
 return (tNew)
end
 
Cheers,
Giorgio
 
------ Messaggio Originale ------
Da: shea at ucar.edu
A: g.graffino at tim.it Cc: ncl-talk at ucar.edu
Inviato: venerdì 21 aprile 2023 19:35
Oggetto: Re: [ncl-talk] Conform a multi-dimensional array to another 
multi-dimensional array
 
Maybe this is a start:
 
=================
 
a(12,100),  b(11,100)     ? meta data
 
=================
  dima = dimsizes(a)
  dimb = dimsizes(b)
 
  na0   = dima(0)
  nb0   = dimb(0)
 
  c       = new(dima, typeof(a))
  c(0:nb0-1) = (/  b /)    ;   (/ ... /) means no meta data
 
; meta data
 
  copy_VatAtts(a,c)    
 
 
; If necessary, coordinate info (named dimensions and coordinate values) 
will hav e to be added 
 
  
 
 
 

 
On Fri, Apr 21, 2023 at 6:21 AM Giorgio Graffino via ncl-talk 
<ncl-talk at mailman.ucar.edu <mailto:ncl-talk at mailman.ucar.edu> > wrote:
 
Dear NCL folks,
 
I have two multi-dimensional arrays: array a is 12x100 and array b is 
11x100. I want to conform them to make their dimensions the same. I'm 
sure there is an easy way to do it, but so far I failed all attempts.
 
For now, I mainly tried to add a row of missing values to array b to get 
an array c with dimensions 12x100 (the same of array a). Here is a list 
of the things I tried with their error message.
 
c = conform(a,b,1)                ; fatal:conform: The array to be 
conformed must have the same number of dimensions as indicated by the 
length of the last argument
 
c = (/b,new(dimsizes(b(0,:)),typeof(b),b at _FillValue)/)          ; 
fatal:_NclBuildArray: each element of a literal array must have the same 
number of dimensions
 
c = 
array_append_record(b,new(dimsizes(b(0,:)),typeof(b),b at _FillValue),0)   
               ; array_append_record: ranks not equal: rank_x1=2 
 rank_x2=1
 
c = table_attach_rows(b,new(dimsizes(b(0,:)),typeof(b),b at _FillValue),0) 
            ; fatal:Number of dimensions in parameter (1) of 
(table_attach_rows) is (1), (2) dimensions were expected
 
Please let me know what else I can try or what I've done wrong.
 
Thanks,
Giorgio
_______________________________________________
ncl-talk mailing list
ncl-talk at mailman.ucar.edu <mailto:ncl-talk at mailman.ucar.edu>
List instructions, subscriber options, unsubscribe:
https://mailman.ucar.edu/mailman/listinfo/ncl-talk 
<https://mailman.ucar.edu/mailman/listinfo/ncl-talk>
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.ucar.edu/pipermail/ncl-talk/attachments/20230424/ee50ba91/attachment.htm>


More information about the ncl-talk mailing list