[ncl-talk] Conform a multi-dimensional array to another multi-dimensional array
Giorgio Graffino
g.graffino at tim.it
Tue Apr 25 01:25:53 MDT 2023
Hi Dave,
Thanks for your suggestion. I'll stick with my table_attach_singlerow
function for now.
Cheers,
Giorgio
------ Messaggio Originale ------
Da: dave.allured at noaa.gov
A: g.graffino at tim.it Cc: ncl-talk at ucar.edu
Inviato: lunedì 24 aprile 2023 14:54
Oggetto: Re: [ncl-talk] Conform a multi-dimensional array to another
multi-dimensional array
Giorgio, here is a compact version of Dennis's method. This preserves
attributes, coordinates, and the fill value. Assumptions are that dim 1
increases by 1, dim 2 is the same, and the new row is added in the last
position. Originally you said "easy", so here you go. Untested:
nrows = dimsizes (a, 0)
c = new (dimsizes (a), typeof (b), getFillValue (b))
c(0:nrows-2,:) = b(:,:)
On Mon, Apr 24, 2023 at 6:09 AM Giorgio Graffino via ncl-talk
<ncl-talk at mailman.ucar.edu <mailto:ncl-talk at mailman.ucar.edu> > wrote:
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
<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 <mailto:shea at ucar.edu>
A: g.graffino at tim.it <mailto:g.graffino at tim.it> Cc: ncl-talk at ucar.edu
<mailto: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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.ucar.edu/pipermail/ncl-talk/attachments/20230425/8701ec36/attachment.htm>
More information about the ncl-talk
mailing list