On Mon, 2018-04-09 at 13:37 +0200, Hameer Abbasi wrote:
> I've renamed the kwarg to `initial`. I'm willing to make the object
> dtype changes as well, if someone pointed me to relevant bits of
> code.
> 
> Unfortunately, currently, the identity is only used for object dtypes
> if the reduction is empty. I think this is to prevent things like `0`
> being passed in the sum of objects (and similar cases), which makes
> sense.
> 
> However, with the kwarg, it makes sense to include it in the
> reduction. I think the change will be somewhere along the lines of:
> Detect if `initial` was passed, if so, include for object, otherwise
> exclude.
> 
> I personally feel `initial` renders `default` redundant. It can be
> used for both purposes. I can't think of a reasonable use case where
> you would want the default to be different from the initial value.
> However, I do agree that fixing the object case is important, we
> don't want users to get used to this behaviour and then rely on it
> later.

The reason would be the case of NaN which is not a possible initial
value for the reduction.
I personally find the object case important, if someone seriously
argues the opposite I might be swayed possibly.

- Sebastian


> 
> Hameer
> 
> On Mon, Mar 26, 2018 at 8:09 PM, Sebastian Berg <sebastian@sipsolutio
> ns.net> wrote:
> > On Mon, 2018-03-26 at 17:40 +0000, Eric Wieser wrote:
> > > The difficulty in supporting object arrays is that
> > func.reduce(arr,
> > > initial=func.identity) and func.reduce(arr) have different
> > meanings -
> > > whereas with the current patch, they are equivalent.
> > >
> > 
> > True, but the current meaning is:
> > 
> > func.reduce(arr, intial=<NoValue>, default=func.identity)
> > 
> > in the case for object dtype. Luckily for normal dtypes,
> > func.identity
> > is both the correct default "default" and a no-op for initial. Thus
> > the
> > name "identity" kinda works there. I am also not really sure that
> > both
> > kwargs would make real sense (plus initial probably disallows
> > default...), but I got some feeling that the "default" meaning may
> > be
> > even more useful to simplify special casing the empty case.
> > 
> > Anyway, still just pointing out that I it gives me some headaches
> > to
> > see such a special case for objects :(.
> > 
> > - Sebastian
> > 
> > 
> > >
> > > On Mon, 26 Mar 2018 at 10:10 Sebastian Berg <sebastian@sipsolutio
> > ns.n
> > > et> wrote:
> > > > On Mon, 2018-03-26 at 12:59 -0400, Hameer Abbasi wrote:
> > > > > That may be complicated. Currently, the identity isn't used
> > in
> > > > object
> > > > > dtype reductions. We may need to change that, which could
> > cause a
> > > > > whole lot of other backwards incompatible changes. For
> > example,
> > > > sum
> > > > > actually including zero in object reductions. Or we could
> > pass in
> > > > a
> > > > > flag saying an initializer was passed in to change that
> > > > behaviour. If
> > > > > this is agreed upon and someone is kind enough to point me to
> > the
> > > > > code, I'd be willing to make this change.
> > > >
> > > > I realize the implication, I am not suggesting to change the
> > > > default
> > > > behaviour (when no initial=... is passed), I would think about
> > > > deprecating it, but probably only if we also have the `default`
> > > > argument, since otherwise you cannot replicate the old
> > behaviour.
> > > >
> > > > What I think I would like to see is to change how it works if
> > (and
> > > > only
> > > > if) the initializer is passed in. Yes, this will require
> > holding on
> > > > to
> > > > some extra information since you will have to know/remember
> > whether
> > > > the
> > > > "identity" was passed in or defined otherwise.
> > > >
> > > > I did not check the code, but I would hope that it is not
> > awfully
> > > > tricky to do that.
> > > >
> > > > - Sebastian
> > > >
> > > >
> > > > PS: A side note, but I see your emails as a single block of
> > text
> > > > with
> > > > no/broken new-lines.
> > > >
> > > >
> > > > >  On 26/03/2018 at 18:54,
> > > > > Sebastian wrote: On Mon, 2018-03-26 at 18:48 +0200, Sebastian
> > > > Berg
> > > > > wrote: On Mon, 2018-03-26 at 11:53 -0400, Hameer Abbasi
> > wrote:
> > > > It'll
> > > > > need to be thought out for object arrays and subclasses. But
> > for
> > > > > Regular numeric stuff, Numpy uses fmin and this would have
> > the
> > > > > desired
> > > > > effect. I do not want to block this, but I would like a
> > clearer
> > > > > opinion about this issue, `np.nansum` as Benjamin noted would
> > > > require
> > > > > something like: np.nansum([np.nan], default=np.nan) because
> > > > > np.sum([1], initializer=np.nan) np.nansum([1],
> > > > initializer=np.nan)
> > > > > would both give NaN if the logic is the same as the current
> > > > `np.sum`.
> > > > > And yes, I guess for fmin/fmax NaN happens to work. And then
> > > > there
> > > > > are
> > > > > many nonsense reduces which could make sense with
> > `initializer`.
> > > > Now
> > > > > nansum is not implemented in a way that could make use of the
> > new
> > > > > kwarg anyway, so maybe it does not matter in some sense. We
> > can
> > > > in
> > > > > principle use `default` in nansum and at some point possibly
> > add
> > > > > `default` to the normal ufuncs. If we argue like that, the
> > only
> > > > > annoying thing is the `object` dtype which confuses the two
> > use
> > > > cases
> > > > > currently. This confusion IMO is not harmless, because I
> > might
> > > > want
> > > > > to
> > > > > use it (e.g. sum with initializer=5), and I would expect
> > things
> > > > like
> > > > > dropping in `decimal.Decimal` to work most of the time, while
> > > > here it
> > > > > would give silently bad results. In other words: I am very
> > very
> > > > much
> > > > > in favor if you get rid that object dtype special case. I
> > frankly
> > > > not
> > > > > see why not (except that it needs a bit more code change). If
> > > > given
> > > > > explicitly, we might as well force the use and not do the
> > funny
> > > > stuff
> > > > > which is designed to be more type agnostic! If it happens to
> > fail
> > > > due
> > > > > to not being type agnostic, it will at least fail loudly. If
> > you
> > > > > leave
> > > > > that object special case I am *very* hesitant about it. That
> > I
> > > > think
> > > > > I
> > > > > would like a `default` argument as well, is another issue and
> > it
> > > > can
> > > > > wait to another day. - Sebastian - Sebastian On 26/03/2018 at
> > > > 17:45,
> > > > > Sebastian wrote: On Mon, 2018-03-26 at 11:39 -0400, Hameer
> > Abbasi
> > > > > wrote: That is the idea, but NaN functions are in a separate
> > > > branch
> > > > > for another PR to be discussed later. You can see it on my
> > fork,
> > > > if
> > > > > you're interested. Except that as far as I understand I am
> > not
> > > > sure
> > > > > it
> > > > > will help much with it, since it is not a default, but an
> > > > > initializer.
> > > > > Initializing to NaN would just make all results NaN. -
> > Sebastian
> > > > On
> > > > > 26/03/2018 at 17:35, Benjamin wrote: Hmm, this is neat. I
> > imagine
> > > > it
> > > > > would finally give some people a choice on what
> > > > np.nansum([np.nan])
> > > > > should return? It caused a huge hullabeloo a few years ago
> > when
> > > > we
> > > > > changed it from returning NaN to returning zero. Ben Root On
> > Mon,
> > > > Mar
> > > > > 26, 2018 at 11:16 AM, Sebastian Berg <sebastian@sipsolutions.
> > net>
> > > > > wrote: OK, the new documentation is actually clear:
> > initializer :
> > > > > scalar, optional The value with which to start the reduction.
> > > > > Defaults
> > > > > to the `~numpy.ufunc.identity` of the ufunc. If ``None`` is
> > > > given,
> > > > > the
> > > > > first element of the reduction is used, and an error is
> > thrown if
> > > > the
> > > > > reduction is empty. If ``a.dtype`` is ``object``, then the
> > > > > initializer
> > > > > is _only_ used if reduction is empty. I would actually like
> > to
> > > > say
> > > > > that I do not like the object special case much (and it is
> > > > probably
> > > > > the reason why I was confused), nor am I quite sure this is
> > what
> > > > > helps
> > > > > a lot? Logically, I would argue there are two things: 1.
> > > > > initializer/start (always used) 2. default (oly used for
> > empty
> > > > > reductions) For example, I might like to give `np.nan` as the
> > > > default
> > > > > for some empty reductions, this will not work. I understand
> > that
> > > > this
> > > > > is a minimal invasive PR and I am not sure I find the
> > solution
> > > > bad
> > > > > enough to really dislike it, but what do other think? My
> > first
> > > > > expectation was the default behaviour (in all cases, not just
> > > > object
> > > > > case) for some reason. To be honest, for now I just wonder a
> > bit:
> > > > How
> > > > > hard would it be to do both, or is that too annoying? It
> > would at
> > > > > least get rid of that annoying thing with object ufuncs
> > (which
> > > > > currently have a default, but not really an
> > > > identity/initializer).
> > > > > Best, Sebastian On Mon, 2018-03-26 at 08:20 -0400, Hameer
> > Abbasi
> > > > > wrote: > Actually, the behavior right now isn’t that of
> > `default`
> > > > but
> > > > > that of > `initializer` or `start`. > > This was discussed
> > > > further
> > > > > down in the PR but to reiterate: > `np.sum([10],
> > initializer=5)`
> > > > > becomes `15`. > > Also, `np.min([5], initializer=0)` becomes
> > `0`,
> > > > so
> > > > > it isn’t really > the default value, it’s the initial value
> > among
> > > > > which the reduction > is performed. > > This was the reason
> > to
> > > > call
> > > > > it
> > > > > initializer in the first place. I like > `initial` and
> > > > > `initial_value`
> > > > > as well, and `start` also makes sense > but isn’t descriptive
> > > > enough.
> > > > > > > Hameer > Sent from Astro for Mac > > > On Mar 26, 2018 at
> > > > 12:06,
> > > > >
> > > > > Sebastian Berg <sebast...@sipsolutions.ne > > t> wrote: > > >
> > >
> > > > > Initializer or this sounds fine to me. As an other data point
> > > > which >
> > > > > > I > > think has been mentioned before, `sum` uses start and
> > > > min/max
> > > > >
> > > > > use > > default. `start` does not work, unless we also change
> > the
> > > > > code
> > > > > to > > always use the identity if given (currently that is
> > not
> > > > the
> > > > > case), > > in > > which case it might be nice. However,
> > "start"
> > > > seems
> > > > > a bit like > > solving > > a different issue in any case. > >
> > > >
> > > > > Anyway, mostly noise. I really like adding this, the only
> > thing >
> > > > >
> > > > > worth > > discussing a bit is the name :). - Sebastian > > >
> > > >
> > > > > On
> > > > > Mon, 2018-03-26 at 05:57 -0400, Hameer Abbasi wrote: > > > It
> > > > calls
> > > > > it
> > > > > `initializer` - See https://docs.python.org/3.5/libra > > >
> > ry/f
> > > > > >
> > > > > >
> > > > > unctools.html#functools.reduce > > > > > > Sent from Astro
> > for
> > > > Mac On
> > > > > Mar 26, 2018 at 09:54, Eric Wieser <wieser.eric+numpy@gmail.
> > > >
> > > > com>
> > > > > > > > > wrote: > > > > > > > > It turns out I mispoke -
> > > > >
> > > > > functools.reduce calls the argument > > > > `initial` > > > >
> > > >
> > > > >
> > > > > On
> > > > > Mon, 26 Mar 2018 at 00:17 Stephan Hoyer <sho...@gmail.com> >
> > > >
> > > > > wrote: > > > > > This looks like a very logical addition to
> > the
> > > > > reduce
> > > > > interface. > > > > > It has my support! > > > > > > > > > I
> > would
> > > > > have
> > > > > preferred the more descriptive name > > > > >
> > "initial_value", >
> > > > > >
> > > > > >
> > > > > > but consistency with functools.reduce makes a compelling
> > case >
> > > > > >
> > > > > > > for > > > > > "initializer". > > > > > On Sun, Mar 25,
> > 2018
> > > > at
> > > > >
> > > > > 1:15 PM Eric Wieser <wieser.eric+nump y@gm > > > > > ail.com>
> > > > wrote:
> > > > > To reiterate my comments in the issue - I'm in favor of >
> > this. >
> > > > > >
> > > > > > > > > > > > > > It seems seem especially valuable for
> > identity-
> > > > less
> > > > > > > > > > >
> > > > > > > > > > > functions > > > > (`min`, `max`, `lcm`), and the
> > > > argument
> > > > >
> > > > > name is consistent > > > with > `functools.reduce`. too. > >
> > > >
> > > > > >
> > > > > >
> > > > > > > > > > The only argument I can see against merging this
> > would
> > > > be >
> > > > > > > > > > `kwarg`-creep of `reduce`, and I think this has
> > enough
> > > > use
> > > > > > > > > > >
> > > > > > > >
> > > > > > > > cases to justify that. > > > > > > > > > > > > I'd like
> > to
> > > > > > > > merge
> > > > >
> > > > > in a few days, if no one else has any > > > > > > opinions. >
> > > >
> > > > > >
> > > > > > Eric > > > > > > > > > > > > On Fri, 16 Mar 2018 at 10:13
> > > > Hameer
> > > > >
> > > > > Abbasi <einstein.edison > > > > > > @gma > > > > > > il.com>
> > > > wrote:
> > > > > Hello, everyone. I’ve submitted a PR to add a initializer
> > kwarg
> > > > to
> > > > > ufunc.reduce. This is useful in a few cases, e.g., > > > > >
> > > >
> > > > it
> > > > > allows one to supply a “default” value for identity- > > > >
> > > >
> > > > >
> > > > > less > > > > > > > ufunc reductions, and specify an initial
> > value
> > > > for
> > > > > > > > > > > > reductions such as sum (other than zero.) > > >
> > > >
> > > > > >
> > > > > > > > > >
> > > > > > > > > > Please feel free to review or leave feedback,
> > (although
> > > > I >
> > > > > > > > >
> > > > > > > > > think Eric and Marten have picked it apart pretty
> > well).
> > > > > >
> > > > > > > > > >
> > > > > >
> > > > > > https://github.com/numpy/numpy/pull/10635 > > > > > Thanks,
> > > >
> > > > > >
> > > > >
> > > > > Hameer > > > > Sent from Astro for Mac > > > > >
> > > > > _______________________________________________ > > > NumPy-
> > > > > Discussion
> > > > > mailing list > > > > > > > NumPy-Discussion@python.org > > >
> > > >
> > > > > >
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion > >
> > > >
> > > > >
> > > > > _______________________________________________ > > > > >
> > > > > NumPy-Discussion mailing list > > > > > > NumPy-Discussion@py
> > thon
> > > > .o
> > > > > rg
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussi on
> > > > > _______________________________________________ > > > >
> > > > > NumPy-Discussion mailing list > > > > > NumPy-Discussion@pyth
> > on.o
> > > > rg
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion > >
> > > > > _______________________________________________ > > > >
> > > > > NumPy-Discussion mailing list > > > > NumPy-Discussion@python
> > .org
> > > >  >
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion > >
> > > >
> > > > > _______________________________________________ > > > NumPy-
> > > > > Discussion mailing list > > > NumPy-Discussion@python.org > >
> > >
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion > >
> > > >
> > > > > _______________________________________________ > > NumPy-
> > > > Discussion
> > > > > mailing list > > NumPy-Discussion@python.org > >
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion > >
> > > > > _______________________________________________ > NumPy-
> > > > Discussion
> > > > > mailing list > NumPy-Discussion@python.org >
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion
> > > > > _______________________________________________ NumPy-
> > Discussion
> > > > > mailing list NumPy-Discussion@python.org
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion
> > > > > _______________________________________________ NumPy-
> > Discussion
> > > > > mailing list NumPy-Discussion@python.org
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion
> > > > > _______________________________________________ NumPy-
> > Discussion
> > > > > mailing list NumPy-Discussion@python.org
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion
> > > > > _______________________________________________ NumPy-
> > Discussion
> > > > > mailing list NumPy-Discussion@python.org
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion
> > > > > _______________________________________________
> > > > > NumPy-Discussion mailing list
> > > > > NumPy-Discussion@python.org
> > > > > https://mail.python.org/mailman/listinfo/numpy-discussion____
> > ____
> > > > _______________________________________
> > > > NumPy-Discussion mailing list
> > > > NumPy-Discussion@python.org
> > > > https://mail.python.org/mailman/listinfo/numpy-discussion
> > >
> > > _______________________________________________
> > > NumPy-Discussion mailing list
> > > NumPy-Discussion@python.org
> > > https://mail.python.org/mailman/listinfo/numpy-discussion
> > 
> > _______________________________________________
> > NumPy-Discussion mailing list
> > NumPy-Discussion@python.org
> > https://mail.python.org/mailman/listinfo/numpy-discussion
> > 
> 
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@python.org
> https://mail.python.org/mailman/listinfo/numpy-discussion

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@python.org
https://mail.python.org/mailman/listinfo/numpy-discussion

Reply via email to