Re: Extension to BinLists Function
- To: mathgroup at smc.vnet.net
- Subject: [mg124121] Re: Extension to BinLists Function
- From: Darren Glosemeyer <darreng at wolfram.com>
- Date: Tue, 10 Jan 2012 05:56:32 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201201071019.FAA19388@smc.vnet.net> <201201080927.EAA01399@smc.vnet.net>
Yes, this particular issue was fixed for version 8.0.4, so Don likely
just needs to get that update to get the fix. As a workaround, the
Infinity's can be replaced with values outside the range of the data, e.g.
breakPoints = {-10^6, 2, 5, 7, 10^6};
data1 = {{1, 0.936229}, {3, 0.128096}, {2, 0.393583}, {1,
0.301525}, {4, 0.503822}, {5, 0.253597}, {6, 0.0835316}, {2,
0.0068356}};
res1 = First /@ BinLists[data1, {breakPoints}, {{-10^6, 10^6}}]
should work fine in his version.
Darren Glosemeyer
Wolfram Research
On 1/8/2012 3:27 AM, Bob Hanlon wrote:
> With my version I do not have a problem with using infinities as the boundaries
>
> $Version
>
> "8.0 for Mac OS X x86 (64-bit) (October 5, 2011)"
>
> breakPoints = {-Infinity, 2, 5, 7, Infinity};
>
> data1 = {{1, 0.936229}, {3, 0.128096}, {2, 0.393583}, {1, 0.301525},
> {4, 0.503822}, {5, 0.253597}, {6, 0.0835316}, {2, 0.0068356}};
>
> res1 = First /@ BinLists[data1, {breakPoints}, {{-Infinity, Infinity}}]
>
> {{{1, 0.936229}, {1, 0.301525}}, {{3, 0.128096}, {2, 0.393583}, {4,
> 0.503822}, {2, 0.0068356}}, {{5, 0.253597}, {6, 0.0835316}}, {}}
>
> For your second example, note that your bins do not cover all of your
> data and those items with second element below 0.1 or greater than 1
> should not appear.
>
> brkPts = Range[.1, 1.0, .1];
>
> res2 = BinLists[data1, {{-Infinity, Infinity}}, {brkPts}] // First
>
> {{{3, 0.128096}}, {{5, 0.253597}}, {{2, 0.393583}, {1, 0.301525}}, {}, {{4,
> 0.503822}}, {}, {}, {}, {{1, 0.936229}}}
>
> To obtain the result that you stated, I redefine your brkPts
>
> brkPts2 = Flatten[{-Infinity, Range[.1, 1.0, .1], Infinity}];
>
> res3 = BinLists[data1, {{-Infinity, Infinity}}, {brkPts2}] // First
>
> {{{6, 0.0835316}, {2, 0.0068356}}, {{3, 0.128096}}, {{5, 0.253597}}, {{2,
> 0.393583}, {1, 0.301525}}, {}, {{4, 0.503822}}, {}, {}, {}, {{1,
> 0.936229}}, {}}
>
> For your third example, brkPts2 is undefined. I will use brkPts2 from
> my last example. For the general case, I would use Cases and Table
>
> data2 = {{1, 0.936229, {2, .03}}, {3, 0.128096, {9, .73}}, {2,
> 0.393583, {4, .22}},
> {8, 0.301525, {2, .18}}, {1, 0.503822, {6, .19}}, {5, 0.253597, {3, .20}},
> {6, 0.0835316, {3, .29}}, {2, 0.0068356, {4, .81}}};
>
> binLists[array_List, breakPts_List, pos_List: {}] :=
> If[pos == {},
> BinLists[array, {breakPts}],
> Table[Cases[
> array, _?(breakPts[[k]]<= #[[Sequence @@ pos]]< breakPts[[k + 1]]&],
> {k, Length[breakPts] - 1}]]
>
> res1 == binLists[data1, breakPoints, {1}]
>
> True
>
> res2 == binLists[data1, brkPts, {2}]
>
> True
>
> res3 == binLists[data1, brkPts2, {2}]
>
> True
>
> binLists[data2, brkPts2, {3, 2}]
>
> {{{1, 0.936229, {2, 0.03}}}, {{8, 0.301525, {2, 0.18}}, {1,
> 0.503822, {6, 0.19}}}, {{2, 0.393583, {4, 0.22}}, {5,
> 0.253597, {3, 0.2}}, {6, 0.0835316, {3, 0.29}}}, {}, {}, {}, {}, {{3,
> 0.128096, {9, 0.73}}}, {{2, 0.0068356, {4, 0.81}}}, {}, {}}
>
>
> Bob Hanlon
>
>
> On Sat, Jan 7, 2012 at 5:19 AM, Don<donabc at comcast.net> wrote:
>> Thank you Bob for your response to my problem.
>>
>> I was unable to get a correct answer in exactly the way
>> you have formulated it.
>>
>> When I do
>>
>>
>> breakPoints = {-Infinity, 2, 5, 7, Infinity};
>>
>> data1 = {{1, 0.936229}, {3, 0.128096}, {2, 0.393583}, {1, 0.301525},
>> {4, 0.503822}, {5, 0.253597}, {6, 0.0835316}, {2, 0.0068356}};
>>
>> BinLists[data1, {breakPoints}, {{-Infinity, Infinity}}]
>>
>> I get an error message which says:
>>
>> Interpolation::indat: "Data point {-\[Infinity], 0} contains abscissa -\[Infinity], which is not a real number.
>>
>> And it suggests I click on a link whch redirects me to:
>> ref/message/Interpolation/indat for further
>> explanation.
>>
>> I got around the Infinity problem in
>> the error message by replacing the Infinity in both the breakPoints vector
>> and in {-Infinity, Infinity} with a number that is larger than any number
>> in data1 but which is still finite:
>>
>> brkPts = {-100, 2, 5, 7, 100}
>>
>> and then tried BinLists again:
>>
>>
>> BinLists[data1,{brkPts},{{-100,100}}]
>>
>> which did work and produced:
>>
>> {{{{1,0.936229},{1,0.301525}}},{{{3,0.128096},{2,0.393583},{4,0.503822},{2,0.0068356}}},{{{5,0.253597},{6,0.0835316}}},{{}}}
>>
>> But, I wanted to extend BinLists to being able to
>> bin on any position in the data, not just the first element
>> of a sublist.
>>
>> For example, if I wanted to bin on the second element
>> in a sublist in data1, I don't see how to go about doing that
>> with the above technique.
>>
>>
>> Using the binLists function in my first post it would look like
>> the following:
>>
>> brkPts = Range[.1, 1.0, .1]
>> binLists[data1,brkPts, {2}]
>>
>> which results in the following:
>>
>> {{{6,0.0835316},{2,0.0068356}},{{3,0.128096}},{{5,0.253597}},{{2,0.393583},{1,0.301525}},{},{{4,0.503822}},{},{},{},{{1,0.936229}},{}}
>>
>>
>> The third parameter, {2}, to binLists allows me to specify
>> the element in a sublist of data1 which is to be used for binning,
>> no matter how complicated a sublist is (assuming, of course,
>> that each sublist has the same structure).
>>
>> For example, if I wanted to bin
>> on the second element of the third element
>> in each sublist of data2 below, the
>> third input to binLists would be {3,2}:
>>
>>
>> data2={{1,0.936229, {2,.03}},{3,0.128096, {9,.73}},{2,0.393583, {4,.22}},{8,0.301525, {2,.18}},{1,0.503822, {6,.19}},{5,0.253597, {3,.20}},{6,0.0835316, {3,.29}},{2,0.0068356, {4,.81}}};
>>
>> binLists[data2, brkPts2, {3,2}]
>>
>> which results in
>>
>> {{{1,0.936229,{2,0.03}}},{{8,0.301525,{2,0.18}},{1,0.503822,{6,0.19}}},{{2,0.393583,{4,0.22}},{5,0.253597,{3,0.2}},{6,0.0835316,{3,0.29}}},{},{},{},{},{{3,0.128096,{9,0.73}}},{{2,0.0068356,{4,0.81}}},{},{}}
>>
>>
>> I don't see any way from the documentation to
>> get BinLists to do this as it does not take as input
>> the specification of the element position in the data
>> upon which binning is to occur, like {3,2} above.
>>
>> The trouble with binLists, as mentioned in the first post, is that
>> it is rather clumsy and depends on nested For loops
>> to do most of the work
>> which, I assume from past experience, is quite slow
>> in terms of processor time. I was
>> wondering if there is a faster, perhaps more elegant
>> way, to accomplis this.
>>
>> Thank you.
>>
>> Don
>>
- References:
- Re: Extension to BinLists Function
- From: Don <donabc@comcast.net>
- Re: Extension to BinLists Function
- From: Bob Hanlon <hanlonr357@gmail.com>
- Re: Extension to BinLists Function