Re: logical indexing using more than one variable in a pure function
- To: mathgroup at smc.vnet.net
- Subject: [mg53354] Re: [mg53342] logical indexing using more than one variable in a pure function
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Sat, 8 Jan 2005 02:39:21 -0500 (EST)
- Reply-to: hanlonr at cox.net
- Sender: owner-wri-mathgroup at wolfram.com
x={2,3,4,5,6}; x1={6,5,4,3,2}; Thread[x>3] {False,False,True,True,True} #>3&/@x {False,False,True,True,True} Thread[x>x1] {False,False,False,True,True} Inner[Greater,x,x1,List] {False,False,False,True,True} Inner[#1>#2&,x,x1,List] {False,False,False,True,True} Pick[x, Thread[x>x1]] {5,6} x[[Flatten[Position[Thread[x>x1], True]]]] {5,6} First/@Cases[Transpose[{x,x1}], x_?(#[[1]]>#[[2]]&)] {5,6} Cases[Transpose[{x,x1}], x_?(#[[1]]>#[[2]]&):>x[[1]]] {5,6} First/@Select[Transpose[{x,x1}], #[[1]]>#[[2]]&] {5,6} Bob Hanlon > > From: Ben Barrowes <barrowes at alum.mit.edu> To: mathgroup at smc.vnet.net > Date: 2005/01/06 Thu PM 10:00:43 EST > Subject: [mg53354] [mg53342] logical indexing using more than one variable in a pure function > > I am trying to pick out values from a matrix using a logical mask, i.e. > using logical indexing. > > > I wish the following: > x = {2, 3, 4, 5, 6} > y = {True, False, False, True, True} > x[[y]] > would produce: > {2,5,6} > but instead it produces: > \!\(\* > RowBox[{\(Part::"pspec"\), \(\(:\)\(\ \)\), "\<\"Part specification \ > \\!\\({True, False, False, True, True}\\) is neither an integer nor a > list of \ > integers. \\!\\(\\*ButtonBox[\\\"More\[Ellipsis]\\\", \ > ButtonStyle->\\\"RefGuideLinkText\\\", ButtonFrame->None, \ > ButtonData:>\\\"General::pspec\\\"]\\)\"\>"}]\) > {2, 3, 4, 5, 6}\[LeftDoubleBracket]{True, False, False, True, > True}\[RightDoubleBracket] > > > Here are some working examples when the mask depends upon only one variable: > > pick out values in x > 4 > Select[x, (#1 > 4 &)] > {5, 6} > > BooleanSelect seems to do what I want if I have a logical mask already: > << Statistics`DataManipulation` > BooleanSelect[x, y] > {2, 5, 6} > And now in 5.1, "Pick" does the same thing as BooleanSelect. > But how can I do this in one line? (no need to define y explicitly) > Something like: > Pick[x,x>3] > > > > This seems to work for cases: > Cases[x, x_ /; x > 3] > {4, 5, 6} > and similarly for select: > Select[x, # > 3 &] > {4, 5, 6} > > > But if I have a second List: > x1 = {6, 5, 4, 3, 2} > > How would I index x based on a logical operation on both x and x1? > I hoped something like this would work: > Pick[x,x>x1] > or > Cases[x, {x_,x1_} /; x>x1] > {} > But only x is provided to the pattern match, not {x_,x1_}. > > Or maybe a better Select statement. But how do I make the pure function > accept two arguments? > > For that matter, how can I perform an element by element logical > operation on a list? For example, I would like: > x>3 > to return > {False,False,True,True,True} > instead of > {2, 3, 4, 5, 6} > 3 > and > x>x1 > to return > {False,False,False,True,True} > instead of > {2, 3, 4, 5, 6} > {6, 5, 4, 3, 2} > will something like: > #1 > #2 &, x, x1 > work? > > I would appreciate any suggestions, > Ben > >