Re: How to use Pick[]; Is this a bug?
- To: mathgroup at smc.vnet.net
- Subject: [mg127812] Re: How to use Pick[]; Is this a bug?
- From: awnl <awnl at gmx-topmail.de>
- Date: Thu, 23 Aug 2012 20:50:54 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <k14kr3$7ip$1@smc.vnet.net>
Hi, > Sigh... Yes, documentation can be improved. But it truly isn't > accurate to say "nothing in the documentation gives a hint...". > The key point is the syntax specified for Pick, i.e., > > Pick[list, sel, patt] > > The important part is patt short for pattern, telling you Pick > is doing pattern matching. Other parts of the documentation > discussion pattern matching and how Mathematica goes about it > point out Mathematica tries to match the entire expression with > the specified pattern. I don't think that's the point and tried to make clear that I appreciate and understand the explanation of Peter about what happens. Pattern matching can very well be restricted to only work on certain levels of an expression and probably is more often used with such restrictions than without, ReplaceAll probably rather being an exception than the rule. There are several functions which do use pattern matching and *do* restrict levels, at least by default (c.f. Cases[{0, 1, 2, 0, 3, 4}, Except[0]]) because *that makes sense for their intended purpose*. There are even functions which basically do the same thing except for the (default) level specification, c.f. MemberQ[expr,pat,{0}] vs. MatchQ[expr,pat] (not that MatchQ always only works at level 0). I think it's not unreasonable to expect Pick to choose an appropriate level specification as well when reading this (from the documentation): Pick[list,sel,patt] picks out those list[[Subscript[i, 1],Subscript[i, 2],...]] for which sel[[Subscript[i, 1],Subscript[i, 2],...]] matches patt. especially when there is such an obvious match of the shapes of list and sel as in this case and. Thinking about it I agree that it might not be justified to call this a plain bug, as the documentation is indeed vague enough to allow the observed behavior (if you allow Subscript[i, 1],Subscript[i, 2],... to also mean All) -- just as it would allow something else. But I don't see the problem here is just that the documentation could be improved, but believe that the design decision to use all levels for the pattern matching in Pick without an alternative is not optimal. I say this because I found that making an explicit level specification in pattern matching functions has proven to be a much clearer and more robust approach for me than to try to tweak the patterns to perform the desired level specification "implicitly". Because of that I think a better solution would be to add a level specification argument to Pick, which could do something like: myPick[list_, sel_, pat_, levelspec_] := Pick[list, Replace[sel, {pat :> True, _ :> False}, levelspec]] and would allow to get the desired result like this: myPick[{1, 2, 3, 4, 5}, {9, 0, 7, 0, 6}, Except[0], {1}] Comparing to such an explicit level specification you'll find that Pick implicitly uses levelspec={0,Infinity}. An alternative would be to use levelspec={1,Infinity} for a default behavior which would make more sense IMHO, as making a function call to pick All of an expression seems a relatively odd corner case of how one would want to use Pick. Note that e.g. for Cases and many other functions such an admittedly somewhat arbitrary choice has been made. As it doesn't make a statement about which levelspec it uses for it's pattern matching, the documentation for Pick would perfectly well allow to use {1,Infinity} (or any other level specification) as the internal setting... Whatever we call it, I would certainly not blame the user here for having a wrong expectation of how Mathematica should work in this case. To make that clear was the only intention of my previous post... regards, albert
- Follow-Ups:
- Re: How to use Pick[]; Is this a bug?
- From: Andrzej Kozlowski <akozlowski@gmail.com>
- Re: How to use Pick[]; Is this a bug?