For larger arrays using ($,) with an empty shape will be much faster.
This is because ($,) has special code while ({.@,) doesn't. Of course,
the reason I used it in my original post was blind luck: I mistakenly
thought ({.@,) had special code but would give a domain error on empty
arguments.
a =. i.1e3 1e3
6!:2 '{.@, a'
0.002591
6!:2 '($0) ($,) a'
1.7e_5
6!:2 '($0) $, a'
0.003077
Marshall
On Thu, Nov 09, 2017 at 02:17:11PM -0500, Raul Miller wrote:
> This actually looks like a good idea. I was concerned about
> performance, but this kind of thing also seems just as fast as the
> other approach, and a bit more compact:
>
> num=:(1 [ 0+{.@,) ::0:
> numeric=: 0 = 0 {.@{. ,
> 1e4 timespacex 'numeric 3 4'
> 1.0472e_6 2176
> 1e4 timespacex 'num 3 4'
> 9.204e_7 1408
>
> Plus, we don't have to worry about if sparse array default value will
> ever leak in, in some J version.
>
> Thanks,
>
> --
> Raul
>
> On Thu, Nov 9, 2017 at 1:40 PM, Marshall Lochbaum <[email protected]>
> wrote:
> > Actually, the domain error thing gives me an idea:
> >
> > numeric =: (1[[:+''($,)]) :: 0:
> >
> > numeric i.3 5
> > 1
> > numeric <2 3
> > 0
> > numeric 'abcd'
> > 0
> >
> > Reshape to scalar, attempt to apply complex conjugate, and then return
> > 1. If conjugate failed, return 0. You could skip the reshape, yielding
> > ((1[+) :: 0:), but this gives a false positive on empty character arrays
> > and will actually compute the conjugate of a complex argument, which
> > could be slow.
> >
> > Marshall
> >
> > On Thu, Nov 09, 2017 at 01:01:40PM -0500, Raul Miller wrote:
> >> I would be inclined to do something similar:
> >>
> >> numeric=: 0 = 0 {.@{. ,
> >>
> >> That said, it's usually sufficient to rely on domain errors for this
> >> kind of thing.
> >>
> >> Thanks,
> >>
> >> --
> >> Raul
> >>
> >>
> >>
> >>
> >>
> >>
> >> On Thu, Nov 9, 2017 at 12:20 PM, Michael Berry <[email protected]> wrote:
> >> > Hello J world,
> >> >
> >> > I have a verb that returns scalar 1 if the argument is numeric of any
> >> > shape
> >> > and scalar 0 otherwise.
> >> > It works fine:
> >> >
> >> > numeric i. 5
> >> >
> >> > 1
> >> >
> >> > numeric 9
> >> >
> >> > 1
> >> >
> >> > numeric i. 2 3 4
> >> >
> >> > 1
> >> >
> >> > numeric 'cat'
> >> >
> >> > 0
> >> >
> >> > numeric 3#<i. 4
> >> >
> >> > 0
> >> >
> >> >
> >> > My definition feels clumsy, however. Can anyone suggest something nicer?
> >> >
> >> >
> >> > numeric=: monad : '0 -: 0{ , 1{. 0#y'
> >> >
> >> >
> >> > -Michael
> >> > ----------------------------------------------------------------------
> >> > 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm