# Compare all sublists of two different lists using PartitionMap?

Posted 2 months ago
277 Views
|
7 Replies
|
0 Total Likes
|
 I have an list of values and I would like to cut it into into sublists of 5 elements and compare each sublist with each sublist of another list which will also be 5 elements in length using CanonicalWarpingDistance. I have been successful in using "Partition" to cut the lists into sublists and I have also been successful in using CanonicalWarpingDistance to compare two single sublists. However, I cannot seem to combine the two to output an array of distances between every sublist in the first list and every sublist in the second list. This is what I have tried: seq = {52.000, 52.289, 39.000, 0.000, -10.121, -19.000, -22.000, -28.203, -18.000, -6.000, -5.615, 0.000, 0.000, 1.770, 2.000, 4.000, 3.903, 2.000, -4.000, -3.729, -3.000, 4.000, 20.378, 20.000, 47.000, 74.958, 58.000, 54.000, 68.563, 40.000, 17.000, 16.861, 2.000, -4.000, -11.492, -11.000, -20.000, -21.798, -14.000, 6.000, 7.932, 10.000, -1.000, -4.688, -7.000, -7.000, -10.321, -7.000, \ -7.000, -10.321, -7.000, -7.000, -10.321, -7.000, -7.000, -10.321, \ -7.000, -7.000, -10.321, -7.000}; seq2 = {52.000, 52.289, 39.000, 0.000, -10.121, -19.000, -22.000, -28.203, -18.000, -6.000, \ -5.615, 0.000, 0.000, 1.770, 2.000, 4.000, 3.903, 2.000, -4.000, -3.729, -3.000, 4.000, 20.378, 20.000, 47.000, 74.958, 58.000, 54.000, 68.563, 40.000, 17.000, 16.861, 2.000, -4.000, -11.492, -11.000, -20.000, -21.798, -14.000, 6.000, 7.932, 10.000, -1.000, -4.688, -7.000, -7.000, -10.321, -7.000, \ -7.000, -10.321, -7.000, -7.000, -10.321, -7.000, -7.000, -10.321, \ -7.000, -7.000, -10.321, -7.000}; dist = CanonicalWarpingDistance[Partition[seq, 5], Partition[seq2, 5], Automatic, {"SlantedBand", 950}, Method -> {"MatchingInterval" -> "Flexible"}, DistanceFunction -> EuclideanDistance] This does run but it does not give me an array of distances. Instead it gives me a huge number which is probably the sum of all of the distances. How can I get the output in an array showing distances between each sublist of "seq" and each sublist of "seq2?"
7 Replies
Sort By:
Posted 2 months ago
 I have made a few changes. dist1 are the tuples of your sub list of 5 elements. Have a look and see if this is what you are looking for. seq = {52.000, 52.289, 39.000, 0.000, -10.121, -19.000, -22.000, -28.203, -18.000, -6.000, -5.615, 0.000, 0.000, 1.770, 2.000, 4.000, 3.903, 2.000, -4.000, -3.729, -3.000, 4.000, 20.378, 20.000, 47.000, 74.958, 58.000, 54.000, 68.563, 40.000, 17.000, 16.861, 2.000, -4.000, -11.492, -11.000, -20.000, -21.798, -14.000, 6.000, 7.932, 10.000, -1.000, -4.688, -7.000, -7.000, -10.321, -7.000, \ -7.000, -10.321, -7.000, -7.000, -10.321, -7.000, -7.000, -10.321, \ -7.000, -7.000, -10.321, -7.000}; seq2 = {52.000, 52.289, 39.000, 0.000, -10.121, -19.000, -22.000, -28.203, -18.000, -6.000, -5.615, 0.000, 0.000, 1.770, 2.000, 4.000, 3.903, 2.000, -4.000, -3.729, -3.000, 4.000, 20.378, 20.000, 47.000, 74.958, 58.000, 54.000, 68.563, 40.000, 17.000, 16.861, 2.000, -4.000, -11.492, -11.000, -20.000, -21.798, -14.000, 6.000, 7.932, 10.000, -1.000, -4.688, -7.000, -7.000, -10.321, -7.000, \ -7.000, -10.321, -7.000, -7.000, -10.321, -7.000, -7.000, -10.321, \ -7.000, -7.000, -10.321, -7.000}; dist1 = Tuples[{Partition[seq, 5], Partition[seq2, 5]}]; Table[CanonicalWarpingDistance[dist1[[i, 1]], dist1[[i, 2]], Automatic, {"SlantedBand", 950}, Method -> {"MatchingInterval" -> "Flexible"}, DistanceFunction -> EuclideanDistance], {i, 1, Length[dist1]}] 
Posted 2 months ago
 This works great Paul! Thank you. The only other thing that I need to incorporate is that I need the output in x,y form rather than one long list. It looks like I might be able to use "Array" in place of table to make that happen. Do you have any advice for that?
Posted 2 months ago
 Hi Jamie,I'm not sure what you mean by in x, y form perhaps if you were to give an example of how you need to see the output I or some one else might be able to help.
Posted 2 months ago
 Jamie,Not sure what you mean by x, y form. You can Partition by 2 to generate sublists of pairs. If you want a mapping from sublist pairs to distance you can try this. distances = Table[{dist1[[i, 1]], dist1[[i, 2]]} -> CanonicalWarpingDistance[dist1[[i, 1]], dist1[[i, 2]], Automatic, {"SlantedBand", 950}, Method -> {"MatchingInterval" -> "Flexible"}, DistanceFunction -> EuclideanDistance], {i, 1, Length[dist1]}] The first few elements of the result Column[Take[distances, 4]] { {{{52., 52.289, 39., 0., -10.121}, {52., 52.289, 39., 0., -10.121}} -> 0.}, {{{52., 52.289, 39., 0., -10.121}, {-19., -22., -28.203, -18., -6.}} -> 87.0858}, {{{52., 52.289, 39., 0., -10.121}, {-5.615, 0., 0., 1.77, 2.}} -> 13.7236}, {{{52., 52.289, 39., 0., -10.121}, {4., 3.903, 2., -4., -3.729}} -> 0.0414335} } 
Posted 2 months ago
 Thank you both for your help thus far. Below is an example of what I am looking for as far as final output. The code that I have that produces these values albeit in one list is: seq1 = {52.000, 52.289, 39.000, 0.000, -10.121, -19.000, -22.000, -28.203, -18.000, -6.000, -5.615, 0.000, 0.000, 1.770, 2.000, 4.000, 3.903, 2.000, -4.000, -3.729, -3.000, 4.000, 20.378, 20.000, 47.000, 74.958, 58.000, 54.000, 68.563, 40.000}; seq2 = {52.000, 52.289, 39.000, -12.000, -1.792, -6.000, 49.000, 69.931, 59.000, 24.000, 27.989, 7.000, 7.000, 21.857, 18.000, 41.000, 55.666, 41.000, 18.000, 33.127, 18.000, 41.000, 57.813, 43.000, 25.000, 28.099, 11.000, 2.000, -2.715, -6.000}; dist1 = Tuples[{Partition[seq1, 10, 10], Partition[seq2, 10, 5]}]; outtable = Table [CanonicalWarpingDistance[dist1[[i, 1]], dist1[[i, 2]], Automatic, {"SlantedBand", 950}, Method -> {"MatchingInterval" -> "Flexible"}, DistanceFunction -> CosineDistance], {i, 1, Length[dist1]}] The output is currently: {2936.43, 2010.95, 805.145, 1277.23, 646.763, 40.0572, 11.9107, \ 28.5548, 52.7854, 14.1702, 1305.69, 1775.71, 412.422, 773.669, \ 726.661} but I need this:
 Hi Jamie,Here is a start. The grouping and header numbers are hardcoded but that is relatively easy to fix. columnHeader = Table["seq1(" <> ToString[x] <> "-" <> ToString[x + 9] <> ")", {x, 1, 21, 10}]; rowHeader = Table["seq2(" <> ToString[x] <> "-" <> ToString[x + 9] <> ")", {x, 1, 21, 5}]; rowHeader = Join[{""}, rowHeader]; grid = MapThread[Prepend, {Prepend[ArrayReshape[outtable, {5, 3}], columnHeader], rowHeader}]; Grid[grid, ItemStyle -> {{1 -> Bold}, {1 -> Bold}}, Background -> {{LightYellow, None}, {LightYellow, None}}, Frame -> All]