I have an application where I need to drop some arbitrary list of columns from a ragged array (where of course the shortest array rows have at least all the specified columns).
E.g., given a ragged list:
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5, 6, 7, 8, 9},
{1, 2, 3, 4, 5, 6, 7, 8}}
and a column selection of {1, 3, 5}, the resulting array after dropping these is
{2, 4, 6, 7, 8, 9, 10}, {2, 4}, {2, 4, 6, 7, 8, 9}, {2, 4, 6, 7, 8}
The closest I could find searching here was How to use “Drop” function to drop matrix' rows and columns in an arbitrary way?, but that has (nice) solutions for well-formed arrays, while I'm working with ragged arrays of (1000-100000) X (20-2000).
I've tried schemes using unique padding to the length of the longest row, operating, then dropping the padding and found that slow.
I'm currently using:
colDropper[array_, cols_] := Module[{s = Split[Sort@cols, #2 == #1 + 1 &]},
Fold[Drop[#, {}, #2] &, array, (DeleteDuplicates /@ s[[All, {1, -1}]]) -
Most@Accumulate@Prepend[Length /@ s, 0]]]
which does the job and performs... OK, but there's got to be a way that combines elegance and speed (unfortunately, as with most data I work with, not machine-precision is the usual here so compiling seems out...)
Allspec would work, but in hindsight this is logical. +1. – Leonid Shifrin Mar 11 '14 at 13:07{2,3,4,5,6,7,8,9,10,11,12,13,14,15,16(the sensor data tends to get dropped in clumps). With packed arrays, these numbers about double. Puzzling, I'd guess your version of Mathematica might explain differing results. As always, thanks for reply and a big fat +1 for taking the time. – ciao Mar 11 '14 at 23:46