There is no faster way, although you can speed up "isblank": [: -. {.@(0&{.) -:"1 ]
It's wasteful to catenate ' ' to a great big array only to take and drop its first cell. On Fri, Apr 13, 2018 at 12:24 PM, Joe Bogner <joebog...@gmail.com> wrote: > Well, I stumbled upon a fast way that takes advantage of simple > multiplication > > _ * 0 = 0 > _ * 1 = _ > 5 * 1 = 5 > > > _3 {. (-.@isblank * _&".) c1 > 1.01 _ 0 > (6!:2) '(isblank * _&".) c1' > 1.00593 > > I'm still interested in alternatives that are similar speed if possible > > > > > > On Fri, Apr 13, 2018 at 3:19 PM, Joe Bogner <joebog...@gmail.com> wrote: > > > Thank you -- Yes, I didn't want to send along the full sample, although I > > could have created some dummy data. > > > > Both Don and Raul's method are similar and are equally slow as the way I > > had > > > > It's not terribly important but I have like 10 numeric columns that I > > convert in a script and have to painfully wait 30 seconds each time I run > > the script. If I could shave 20 seconds off something that I seem to be > > running multiple times a day and learn something in the process, I > figured > > it was worthwhile to ask > > > > (6!:2) '{.@(_&".)"1 c' > > 3.44371 > > > > Here's a reasonable approximation: > > > > c1 =. 1.5e6 # (>' ';'bad';'10') > > > > > > c1=: (((5e6,4)$'1.01'),'bad'),' ' > > $ c1 > > 5000002 4 > > (6!:2) '{.@(_&".)"1 c1' > > 3.29915 > > > > > > Compare to > > > > (6!:2) '_ ". c1' > > 1.01854 > > > > _3 {. _ ". c1 NB. bad values at the end... ideally the blank is 0 > though > > 1.01 _ _ > > > > > > On Fri, Apr 13, 2018 at 2:13 PM, Raul Miller <rauldmil...@gmail.com> > > wrote: > > > >> Your sample data does not match your problem description. > >> > >> That said, > >> > >> {.@(_&".)"1 > ' ';'bad';'10' > >> 0 _ 10 > >> > >> Thanks, > >> > >> -- > >> Raul > >> > >> > >> On Fri, Apr 13, 2018 at 2:03 PM, Joe Bogner <joebog...@gmail.com> > wrote: > >> > I have a large byte array that I want to convert to a number array. I > >> want > >> > to use _ to indicate a bad value, but blank should be treated as 0 > >> > > >> > $ c > >> > 4862343 10 > >> > > >> > Instead of this: > >> > > >> > asnumber =: _&". > >> > > >> > asnumber (>' ';'bad';'10') > >> > _ _ 10 > >> > > >> > I want this: > >> > > >> > > >> > asnumber (>' ';'bad';'10') > >> > 0 _ 10 > >> > > >> > This works, but is much slower than I'd like -- nearly 3x slower than > >> just > >> > _ ". > >> > > >> > asnumber =: _ ". '0' ,~^:([: */ ' '&=@])"1 ] > >> > asnumber (>' ';'bad';'10') > >> > 0 _ 10 > >> > > >> > (6!:2) 'asnumber c' > >> > 3.32579 > >> > (6!:2) '_&". c' > >> > 1.35091 > >> > > >> > > >> > I have an isblank function that is fast > >> > > >> > isblank =. ([: ({. -:"1 }.) ' '&,) > >> > (6!:2) 'isblank c' > >> > 0.033164 > >> > > >> > I can't seem to combine the two into something that performs well > >> without > >> > doing things at the atom/row level instead of the entire array. I > >> suspect > >> > I'm getting tripped up by rank > >> > ------------------------------------------------------------ > ---------- > >> > For information about J forums see http://www.jsoftware.com/ > forums.htm > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > >> > > > > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm