Re: Re: Selecting Rows Where All Columns Satisfy a Condition-Plot of Code speeds
- To: mathgroup at smc.vnet.net
- Subject: [mg82788] Re: [mg82589] Re: Selecting Rows Where All Columns Satisfy a Condition-Plot of Code speeds
- From: Syd Geraghty <sydgeraghty at mac.com>
- Date: Wed, 31 Oct 2007 06:07:33 -0500 (EST)
- References: <ffppu6$l6g$1@smc.vnet.net> <200710260908.FAA21913@smc.vnet.net>
Hi all,
I have been struck by how may different code suggestions can be
generated by a seemingly simple request for help.
Below is a ListPlot of the speed of 10 inputs in reply to the post
[mg82589] Re : Selecting Rows Where All Columns Satisfy a Condition.
As you can see by running this code there is a significant difference
and the most arcane code won.
Below is a quick and specific attempt to get a first cut benchmark to
assess code variations. I would be very interested if anyone has
generated
a more sophisticated benchmark method that would take a variable
number of code snippets and the initialisation code required and
generate
a nice benchmark result. It seems to me that such a tool could be
very useful to all of us who have an ongoing interest in learning how
to write the
most elegant and efficient Mathematica code to pursue our interests.
I have used Tooltip to identify the options but maybe labels would be
nicer.
I would appreciate a response or any suggestions to speed up the
process of generating the plots.
(Thanks to everyone who generated the code suggestions).
(* Tooltip Test of speed for the different codes to solve the specific \
integer exclusion question*)
r := RandomInteger[{-10, -1}]; SeedRandom[1]; X =
Table[{r, r, r, r}, {100000}];
ListPlot[a = Sort[{
Tooltip[First[Select[X, FreeQ[#, -9] &]; // Timing],
"Select[X,FreeQ[#,-9]&]"],
Tooltip[First[Select[X, FreeQ[#, -9, {1}] &]; // Timing],
"Select[X,FreeQ[#,-9,{1}]&]"],
Tooltip[First[Select[X, VectorQ[#, # != -9 &] &]; // Timing],
"Select[X,VectorQ[#,#=E2=89=A0-9&]&]"],
Tooltip[First[Select[X, FreeQ[#, -9 | -9.] &]; // Timing],
"FreeQ[#,-9|-9.]&]"],
Tooltip[First[Select[X, ! MemberQ[#, -9. | -9] &]; // Timing],
"Select[X,!MemberQ[#,-9.|-9]&]"],
Tooltip[First[Select[X, And @@ Thread[# != -9] &]; // Timing],
"Select[X,And@@Thread[#=E2=89=A0-9]&]"],
Tooltip[First[Select[X, And @@ (# != -9 & /@ #) &]; // Timing],
"Select[X,And@@(#=E2=89=A0-9&/@#)&]"],
Tooltip[First[X /. {___, -9, ___} -> Sequence[]; // Timing],
"X/.{___,-9,___}=E2=86=92Sequence[]"],
Tooltip[First[DeleteCases[X, {___, -9, ___}]; // Timing],
"DeleteCases[X,{___,-9,___}]"],
Tooltip[
First[
X[[SparseArray[Times @@ (Transpose@X + 9)] /.
SparseArray[_, _, _, p_] :> Flatten@p[[2, 2]]]]; // Timing],
"X[[SparseArray[Times@@(Transpose@X+9)]/.SparseArray[_,_,_,p_]
=C6=92Flatten@p[\
[2,2]]]]"]
}], Filling -> Axis, ImageSize -> {450, 450}, PlotMarkers ->
Automatic,
PlotLabel -> "Fastest Code\n\n" a[[1]][[2]]]
I have also generated a normalised version of the plot (normalised
with respect to the fastest code) but so far have not been able
to do that and preserve the Tooltip information in the plot. The
problem I have here is not yet finding a way of executing the
normalising
division without first stripping the Tooltip data from the list
elements.
Running the code code below shows the issues more clearly than my
brief description of the problem.
normspeed
Sort[{Tooltip[First[Select[X, FreeQ[#, -9] &]; // Timing],
"Select[X,FreeQ[#,-9]&]"],
Tooltip[First[Select[X, FreeQ[#, -9, {1}] &]; // Timing],
"Select[X,FreeQ[#,-9,{1}]&]"],
Tooltip[First[Select[X, VectorQ[#, # != -9 &] &]; // Timing],
"Select[X,VectorQ[#,#=E2=89=A0-9&]&]"],
Tooltip[First[Select[X, FreeQ[#, -9 | -9.] &]; // Timing],
"FreeQ[#,-9|-9.]&]"],
Tooltip[First[Select[X, ! MemberQ[#, -9. | -9] &]; // Timing],
"Select[X,!MemberQ[#,-9.|-9]&]"],
Tooltip[First[Select[X, And @@ Thread[# != -9] &]; // Timing],
"Select[X,And@@Thread[#=E2=89=A0-9]&]"],
Tooltip[First[Select[X, And @@ (# != -9 & /@ #) &]; // Timing],
"Select[X,And@@(#=E2=89=A0-9&/@#)&]"],
Tooltip[First[X /. {___, -9, ___} -> Sequence[]; // Timing],
"X/.{___,-9,___}=E2=86=92Sequence[]"],
Tooltip[First[DeleteCases[X, {___, -9, ___}]; // Timing],
"DeleteCases[X,{___,-9,___}]"],
Tooltip[
First[
X[[SparseArray[Times @@ (Transpose@X + 9)] /.
SparseArray[_, _, _, p_] :> Flatten@p[[2, 2]]]]; // Timing],
"X[[SparseArray[Times@@(Transpose@X+9)]/.SparseArray[_,_,_,p_]
=C6=92Flatten@p[\
[2,2]]]]"]
}] // InputForm
normspeed[[1]]
normspeed[[1]][[1]]
normspeed[[1]]/normspeed[[1]][[1]]
I hope someone can produce an elegant normalised plot.
Cheers ... Syd
Syd Geraghty B.Sc., M.Sc.
sydgeraghty at mac.com
San Jose, CA
My System
Mathematic 6.0.1 for Mac OS X x86 (32 - bit) (June 19, 2007) License =
L2983-5890
MacOS X V 10.4 .10
MacBook Pro 2.33 Ghz Intel Core 2 Duo 2GB RAM
On Oct 26, 2007, at 2:08 AM, Norbert Marxer wrote:
> On 25 Okt., 12:08, Gregory Lypny <gregory.ly... at videotron.ca> wrote:
>> Hello everyone
>>
>> I've got an Nx4 numeric array called X. I'd like to pull out all
>> rows where -9 does not appear in any of the four columns. I know I
>> can this:
>>
>> Select[X, #[[1]] != -9 && #[[2]] != -9 && #[[3]] != -9 && =
#[[4]] !=
>> -9 &]
>>
>> But is there a more elegant way that applies the not-equal-to
>> condition to each column without having to repeat it?
>>
>> Regards,
>>
>> Gregory
>
> Hello
>
> You could use:
>
> Select[X, And @@ (#1 != -9 & ) /@ #1 & ]
>
> The following is a short test of the above code and shows that you get
> the same result:
>
> r := RandomInteger[{-10, -1}]; SeedRandom[1]; X = Table[{r, r, r, =
r},
> {10}];
> Select[X, #1[[1]] != -9 && #1[[2]] != -9 && #1[[3]] != -9 && =
#1[[4]] !
> = -9 & ] == Select[X, And @@ (#1 != -9 & ) /@ #1 & ]
>
> Best Regards
> Norbert Marxer
>
>
>
- References:
- Re: Selecting Rows Where All Columns Satisfy a Condition
- From: Norbert Marxer <marxer@mec.li>
- Re: Selecting Rows Where All Columns Satisfy a Condition