Map list to bin numbersquantilization (if that is a word)Map efficiently over duplicates in listGenerating a list of cubefree numbersIs there an equivalent to MATLAB's linspace?Convert a list of hexadecimal numbers to decimalTaking one list Mod a second listlist of items and group of alternative itemsHow find numbers in this list of inequalities?Selecting list entries with a True False index list of similar lengthReplace element in array by checking condition in another listAttempting to fill a table with the number of elements in each bin and make a table with the elements in the bins?

Is it the same airport YUL and YMQ in Canada?

Why is Arya visibly scared in the library in S8E3?

If an enemy is just below a 10-foot-high ceiling, are they in melee range of a creature on the ground?

Stark VS Thanos

What does air vanishing on contact sound like?

What word means "to make something obsolete"?

Visa for volunteering in England

If 1. e4 c6 is considered as a sound defense for black, why is 1. c3 so rare?

I’ve officially counted to infinity!

Is thermodynamics only applicable to systems in equilibrium?

When and why did journal article titles become descriptive, rather than creatively allusive?

How do i show this equivalence without using integration?

I caught several of my students plagiarizing. Could it be my fault as a teacher?

Unexpected email from Yorkshire Bank

Is it cheaper to drop cargo than to land it?

How do I tell my manager that his code review comment is wrong?

nth number which is divisible by all the numbers from 1 to 10

Applying a function to a nested list

Meaning of "individuandum"

Why is the SNP putting so much emphasis on currency plans?

My ID is expired, can I fly to the Bahamas with my passport?

How did Arya manage to disguise herself?

Does hiding behind 5-ft-wide cover give full cover?

Attending a conference where my ex-supervisor and his collaborator are present, should I attend?



Map list to bin numbers


quantilization (if that is a word)Map efficiently over duplicates in listGenerating a list of cubefree numbersIs there an equivalent to MATLAB's linspace?Convert a list of hexadecimal numbers to decimalTaking one list Mod a second listlist of items and group of alternative itemsHow find numbers in this list of inequalities?Selecting list entries with a True False index list of similar lengthReplace element in array by checking condition in another listAttempting to fill a table with the number of elements in each bin and make a table with the elements in the bins?













4












$begingroup$


Does WL have the equivalent of Matlab's discretize or NumPy's digitize? I.e., a function that takes a length-N list and a list of bin edges and returns a length-N list of bin numbers, mapping each list item to its bin number?










share|improve this question











$endgroup$











  • $begingroup$
    HistogramList seems similar. This could also be done efficiently with GroupBy and some easy little Compile-d selection determiner. Or maybe hit it first with Sort then write something that only checks the next bin up. Again, can be easily Compile-d.
    $endgroup$
    – b3m2a1
    Apr 8 at 23:07











  • $begingroup$
    I need it to work like a map (in terms of the order of the items in the resulting list). Of course it is possible to write something ...
    $endgroup$
    – Alan
    Apr 9 at 0:13











  • $begingroup$
    Related: 140577
    $endgroup$
    – Carl Woll
    Apr 9 at 3:50







  • 1




    $begingroup$
    Did you try BinCounts? I guess it is what you need.
    $endgroup$
    – Rom38
    Apr 9 at 4:52










  • $begingroup$
    @Rom38 You probably meant BinLists, right?
    $endgroup$
    – Henrik Schumacher
    Apr 9 at 5:55















4












$begingroup$


Does WL have the equivalent of Matlab's discretize or NumPy's digitize? I.e., a function that takes a length-N list and a list of bin edges and returns a length-N list of bin numbers, mapping each list item to its bin number?










share|improve this question











$endgroup$











  • $begingroup$
    HistogramList seems similar. This could also be done efficiently with GroupBy and some easy little Compile-d selection determiner. Or maybe hit it first with Sort then write something that only checks the next bin up. Again, can be easily Compile-d.
    $endgroup$
    – b3m2a1
    Apr 8 at 23:07











  • $begingroup$
    I need it to work like a map (in terms of the order of the items in the resulting list). Of course it is possible to write something ...
    $endgroup$
    – Alan
    Apr 9 at 0:13











  • $begingroup$
    Related: 140577
    $endgroup$
    – Carl Woll
    Apr 9 at 3:50







  • 1




    $begingroup$
    Did you try BinCounts? I guess it is what you need.
    $endgroup$
    – Rom38
    Apr 9 at 4:52










  • $begingroup$
    @Rom38 You probably meant BinLists, right?
    $endgroup$
    – Henrik Schumacher
    Apr 9 at 5:55













4












4








4





$begingroup$


Does WL have the equivalent of Matlab's discretize or NumPy's digitize? I.e., a function that takes a length-N list and a list of bin edges and returns a length-N list of bin numbers, mapping each list item to its bin number?










share|improve this question











$endgroup$




Does WL have the equivalent of Matlab's discretize or NumPy's digitize? I.e., a function that takes a length-N list and a list of bin edges and returns a length-N list of bin numbers, mapping each list item to its bin number?







list-manipulation data






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 9 at 5:27









user64494

3,65311222




3,65311222










asked Apr 8 at 22:52









AlanAlan

6,6551125




6,6551125











  • $begingroup$
    HistogramList seems similar. This could also be done efficiently with GroupBy and some easy little Compile-d selection determiner. Or maybe hit it first with Sort then write something that only checks the next bin up. Again, can be easily Compile-d.
    $endgroup$
    – b3m2a1
    Apr 8 at 23:07











  • $begingroup$
    I need it to work like a map (in terms of the order of the items in the resulting list). Of course it is possible to write something ...
    $endgroup$
    – Alan
    Apr 9 at 0:13











  • $begingroup$
    Related: 140577
    $endgroup$
    – Carl Woll
    Apr 9 at 3:50







  • 1




    $begingroup$
    Did you try BinCounts? I guess it is what you need.
    $endgroup$
    – Rom38
    Apr 9 at 4:52










  • $begingroup$
    @Rom38 You probably meant BinLists, right?
    $endgroup$
    – Henrik Schumacher
    Apr 9 at 5:55
















  • $begingroup$
    HistogramList seems similar. This could also be done efficiently with GroupBy and some easy little Compile-d selection determiner. Or maybe hit it first with Sort then write something that only checks the next bin up. Again, can be easily Compile-d.
    $endgroup$
    – b3m2a1
    Apr 8 at 23:07











  • $begingroup$
    I need it to work like a map (in terms of the order of the items in the resulting list). Of course it is possible to write something ...
    $endgroup$
    – Alan
    Apr 9 at 0:13











  • $begingroup$
    Related: 140577
    $endgroup$
    – Carl Woll
    Apr 9 at 3:50







  • 1




    $begingroup$
    Did you try BinCounts? I guess it is what you need.
    $endgroup$
    – Rom38
    Apr 9 at 4:52










  • $begingroup$
    @Rom38 You probably meant BinLists, right?
    $endgroup$
    – Henrik Schumacher
    Apr 9 at 5:55















$begingroup$
HistogramList seems similar. This could also be done efficiently with GroupBy and some easy little Compile-d selection determiner. Or maybe hit it first with Sort then write something that only checks the next bin up. Again, can be easily Compile-d.
$endgroup$
– b3m2a1
Apr 8 at 23:07





$begingroup$
HistogramList seems similar. This could also be done efficiently with GroupBy and some easy little Compile-d selection determiner. Or maybe hit it first with Sort then write something that only checks the next bin up. Again, can be easily Compile-d.
$endgroup$
– b3m2a1
Apr 8 at 23:07













$begingroup$
I need it to work like a map (in terms of the order of the items in the resulting list). Of course it is possible to write something ...
$endgroup$
– Alan
Apr 9 at 0:13





$begingroup$
I need it to work like a map (in terms of the order of the items in the resulting list). Of course it is possible to write something ...
$endgroup$
– Alan
Apr 9 at 0:13













$begingroup$
Related: 140577
$endgroup$
– Carl Woll
Apr 9 at 3:50





$begingroup$
Related: 140577
$endgroup$
– Carl Woll
Apr 9 at 3:50





1




1




$begingroup$
Did you try BinCounts? I guess it is what you need.
$endgroup$
– Rom38
Apr 9 at 4:52




$begingroup$
Did you try BinCounts? I guess it is what you need.
$endgroup$
– Rom38
Apr 9 at 4:52












$begingroup$
@Rom38 You probably meant BinLists, right?
$endgroup$
– Henrik Schumacher
Apr 9 at 5:55




$begingroup$
@Rom38 You probably meant BinLists, right?
$endgroup$
– Henrik Schumacher
Apr 9 at 5:55










3 Answers
3






active

oldest

votes


















3












$begingroup$

Here's a version based on Nearest:



digitize[edges_] := DigitizeFunction[edges, Nearest[edges -> "Index"]]
digitize[data_, edges_] := digitize[edges][data]

DigitizeFunction[edges_, nf_NearestFunction][data_] := With[init = nf[data][[All, 1]],
init + UnitStep[data - edges[[init]]] - 1
]


For example:



SeedRandom[1]
data = RandomReal[10, 10]
digitize[data, 2, 4, 5, 7, 8]



8.17389, 1.1142, 7.89526, 1.87803, 2.41361, 0.657388, 5.42247, 2.31155, 3.96006, 7.00474



5, 0, 4, 0, 1, 0, 3, 1, 1, 4




Note that I broke up the definition of digitize into two pieces, so that if you do this for multiple data sets with the same edges list, you only need to compute the nearest function once.






share|improve this answer











$endgroup$




















    5












    $begingroup$

    This is a very quick-n-dirty, but may serve as a simple example.



    This creates a piecewise function following the first definition in Matlab's discretize documentation, then applies that to the data.



    disc[data_, edges_] := Module[e = Partition[edges, 2, 1], p, l,
    l = Length@e;
    p=Piecewise[Append[Table[i, e[[i, 1]] <= x < e[[i, 2]], i, l - 1]
    , l,e[[l, 1]] <= x <= e[[l, 2]]]
    , "NaN"];
    Table[p, x, data]];


    From the first example in the above referenced documentation:



    data=1, 1, 2, 3, 6, 5, 8, 10, 4, 4;
    edges=2, 4, 6, 8, 10;

    disc[data,edges]



    NaN,NaN,1,1,3,2,4,4,2,2




    I'm sure there are more efficient/elegant solutions, and will revisit as time permits.






    share|improve this answer











    $endgroup$




















      2












      $begingroup$

      You may also use Interpolation with InterpolationOrder -> 0. However, employing Nearest as Carl Woll did will usually be much faster.



      First, we prepare the interplating function.



      m = 20;
      binboundaries = Join[-1., Sort[RandomReal[-1, 1, m - 1]], 1.];

      f = Interpolation[Transpose[binboundaries, Range[0, m]], InterpolationOrder -> 0];


      Now you can apply it to lists of values as follows:



      vals = RandomReal[-1, 1, 1000]; 
      Round[f[vals]]





      share|improve this answer









      $endgroup$













        Your Answer








        StackExchange.ready(function()
        var channelOptions =
        tags: "".split(" "),
        id: "387"
        ;
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function()
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled)
        StackExchange.using("snippets", function()
        createEditor();
        );

        else
        createEditor();

        );

        function createEditor()
        StackExchange.prepareEditor(
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: false,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: null,
        bindNavPrevention: true,
        postfix: "",
        imageUploader:
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        ,
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        );



        );













        draft saved

        draft discarded


















        StackExchange.ready(
        function ()
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f194844%2fmap-list-to-bin-numbers%23new-answer', 'question_page');

        );

        Post as a guest















        Required, but never shown

























        3 Answers
        3






        active

        oldest

        votes








        3 Answers
        3






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        3












        $begingroup$

        Here's a version based on Nearest:



        digitize[edges_] := DigitizeFunction[edges, Nearest[edges -> "Index"]]
        digitize[data_, edges_] := digitize[edges][data]

        DigitizeFunction[edges_, nf_NearestFunction][data_] := With[init = nf[data][[All, 1]],
        init + UnitStep[data - edges[[init]]] - 1
        ]


        For example:



        SeedRandom[1]
        data = RandomReal[10, 10]
        digitize[data, 2, 4, 5, 7, 8]



        8.17389, 1.1142, 7.89526, 1.87803, 2.41361, 0.657388, 5.42247, 2.31155, 3.96006, 7.00474



        5, 0, 4, 0, 1, 0, 3, 1, 1, 4




        Note that I broke up the definition of digitize into two pieces, so that if you do this for multiple data sets with the same edges list, you only need to compute the nearest function once.






        share|improve this answer











        $endgroup$

















          3












          $begingroup$

          Here's a version based on Nearest:



          digitize[edges_] := DigitizeFunction[edges, Nearest[edges -> "Index"]]
          digitize[data_, edges_] := digitize[edges][data]

          DigitizeFunction[edges_, nf_NearestFunction][data_] := With[init = nf[data][[All, 1]],
          init + UnitStep[data - edges[[init]]] - 1
          ]


          For example:



          SeedRandom[1]
          data = RandomReal[10, 10]
          digitize[data, 2, 4, 5, 7, 8]



          8.17389, 1.1142, 7.89526, 1.87803, 2.41361, 0.657388, 5.42247, 2.31155, 3.96006, 7.00474



          5, 0, 4, 0, 1, 0, 3, 1, 1, 4




          Note that I broke up the definition of digitize into two pieces, so that if you do this for multiple data sets with the same edges list, you only need to compute the nearest function once.






          share|improve this answer











          $endgroup$















            3












            3








            3





            $begingroup$

            Here's a version based on Nearest:



            digitize[edges_] := DigitizeFunction[edges, Nearest[edges -> "Index"]]
            digitize[data_, edges_] := digitize[edges][data]

            DigitizeFunction[edges_, nf_NearestFunction][data_] := With[init = nf[data][[All, 1]],
            init + UnitStep[data - edges[[init]]] - 1
            ]


            For example:



            SeedRandom[1]
            data = RandomReal[10, 10]
            digitize[data, 2, 4, 5, 7, 8]



            8.17389, 1.1142, 7.89526, 1.87803, 2.41361, 0.657388, 5.42247, 2.31155, 3.96006, 7.00474



            5, 0, 4, 0, 1, 0, 3, 1, 1, 4




            Note that I broke up the definition of digitize into two pieces, so that if you do this for multiple data sets with the same edges list, you only need to compute the nearest function once.






            share|improve this answer











            $endgroup$



            Here's a version based on Nearest:



            digitize[edges_] := DigitizeFunction[edges, Nearest[edges -> "Index"]]
            digitize[data_, edges_] := digitize[edges][data]

            DigitizeFunction[edges_, nf_NearestFunction][data_] := With[init = nf[data][[All, 1]],
            init + UnitStep[data - edges[[init]]] - 1
            ]


            For example:



            SeedRandom[1]
            data = RandomReal[10, 10]
            digitize[data, 2, 4, 5, 7, 8]



            8.17389, 1.1142, 7.89526, 1.87803, 2.41361, 0.657388, 5.42247, 2.31155, 3.96006, 7.00474



            5, 0, 4, 0, 1, 0, 3, 1, 1, 4




            Note that I broke up the definition of digitize into two pieces, so that if you do this for multiple data sets with the same edges list, you only need to compute the nearest function once.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Apr 9 at 3:52

























            answered Apr 9 at 3:33









            Carl WollCarl Woll

            76.5k3100201




            76.5k3100201





















                5












                $begingroup$

                This is a very quick-n-dirty, but may serve as a simple example.



                This creates a piecewise function following the first definition in Matlab's discretize documentation, then applies that to the data.



                disc[data_, edges_] := Module[e = Partition[edges, 2, 1], p, l,
                l = Length@e;
                p=Piecewise[Append[Table[i, e[[i, 1]] <= x < e[[i, 2]], i, l - 1]
                , l,e[[l, 1]] <= x <= e[[l, 2]]]
                , "NaN"];
                Table[p, x, data]];


                From the first example in the above referenced documentation:



                data=1, 1, 2, 3, 6, 5, 8, 10, 4, 4;
                edges=2, 4, 6, 8, 10;

                disc[data,edges]



                NaN,NaN,1,1,3,2,4,4,2,2




                I'm sure there are more efficient/elegant solutions, and will revisit as time permits.






                share|improve this answer











                $endgroup$

















                  5












                  $begingroup$

                  This is a very quick-n-dirty, but may serve as a simple example.



                  This creates a piecewise function following the first definition in Matlab's discretize documentation, then applies that to the data.



                  disc[data_, edges_] := Module[e = Partition[edges, 2, 1], p, l,
                  l = Length@e;
                  p=Piecewise[Append[Table[i, e[[i, 1]] <= x < e[[i, 2]], i, l - 1]
                  , l,e[[l, 1]] <= x <= e[[l, 2]]]
                  , "NaN"];
                  Table[p, x, data]];


                  From the first example in the above referenced documentation:



                  data=1, 1, 2, 3, 6, 5, 8, 10, 4, 4;
                  edges=2, 4, 6, 8, 10;

                  disc[data,edges]



                  NaN,NaN,1,1,3,2,4,4,2,2




                  I'm sure there are more efficient/elegant solutions, and will revisit as time permits.






                  share|improve this answer











                  $endgroup$















                    5












                    5








                    5





                    $begingroup$

                    This is a very quick-n-dirty, but may serve as a simple example.



                    This creates a piecewise function following the first definition in Matlab's discretize documentation, then applies that to the data.



                    disc[data_, edges_] := Module[e = Partition[edges, 2, 1], p, l,
                    l = Length@e;
                    p=Piecewise[Append[Table[i, e[[i, 1]] <= x < e[[i, 2]], i, l - 1]
                    , l,e[[l, 1]] <= x <= e[[l, 2]]]
                    , "NaN"];
                    Table[p, x, data]];


                    From the first example in the above referenced documentation:



                    data=1, 1, 2, 3, 6, 5, 8, 10, 4, 4;
                    edges=2, 4, 6, 8, 10;

                    disc[data,edges]



                    NaN,NaN,1,1,3,2,4,4,2,2




                    I'm sure there are more efficient/elegant solutions, and will revisit as time permits.






                    share|improve this answer











                    $endgroup$



                    This is a very quick-n-dirty, but may serve as a simple example.



                    This creates a piecewise function following the first definition in Matlab's discretize documentation, then applies that to the data.



                    disc[data_, edges_] := Module[e = Partition[edges, 2, 1], p, l,
                    l = Length@e;
                    p=Piecewise[Append[Table[i, e[[i, 1]] <= x < e[[i, 2]], i, l - 1]
                    , l,e[[l, 1]] <= x <= e[[l, 2]]]
                    , "NaN"];
                    Table[p, x, data]];


                    From the first example in the above referenced documentation:



                    data=1, 1, 2, 3, 6, 5, 8, 10, 4, 4;
                    edges=2, 4, 6, 8, 10;

                    disc[data,edges]



                    NaN,NaN,1,1,3,2,4,4,2,2




                    I'm sure there are more efficient/elegant solutions, and will revisit as time permits.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Apr 9 at 8:03

























                    answered Apr 9 at 0:38









                    ciaociao

                    17.6k138109




                    17.6k138109





















                        2












                        $begingroup$

                        You may also use Interpolation with InterpolationOrder -> 0. However, employing Nearest as Carl Woll did will usually be much faster.



                        First, we prepare the interplating function.



                        m = 20;
                        binboundaries = Join[-1., Sort[RandomReal[-1, 1, m - 1]], 1.];

                        f = Interpolation[Transpose[binboundaries, Range[0, m]], InterpolationOrder -> 0];


                        Now you can apply it to lists of values as follows:



                        vals = RandomReal[-1, 1, 1000]; 
                        Round[f[vals]]





                        share|improve this answer









                        $endgroup$

















                          2












                          $begingroup$

                          You may also use Interpolation with InterpolationOrder -> 0. However, employing Nearest as Carl Woll did will usually be much faster.



                          First, we prepare the interplating function.



                          m = 20;
                          binboundaries = Join[-1., Sort[RandomReal[-1, 1, m - 1]], 1.];

                          f = Interpolation[Transpose[binboundaries, Range[0, m]], InterpolationOrder -> 0];


                          Now you can apply it to lists of values as follows:



                          vals = RandomReal[-1, 1, 1000]; 
                          Round[f[vals]]





                          share|improve this answer









                          $endgroup$















                            2












                            2








                            2





                            $begingroup$

                            You may also use Interpolation with InterpolationOrder -> 0. However, employing Nearest as Carl Woll did will usually be much faster.



                            First, we prepare the interplating function.



                            m = 20;
                            binboundaries = Join[-1., Sort[RandomReal[-1, 1, m - 1]], 1.];

                            f = Interpolation[Transpose[binboundaries, Range[0, m]], InterpolationOrder -> 0];


                            Now you can apply it to lists of values as follows:



                            vals = RandomReal[-1, 1, 1000]; 
                            Round[f[vals]]





                            share|improve this answer









                            $endgroup$



                            You may also use Interpolation with InterpolationOrder -> 0. However, employing Nearest as Carl Woll did will usually be much faster.



                            First, we prepare the interplating function.



                            m = 20;
                            binboundaries = Join[-1., Sort[RandomReal[-1, 1, m - 1]], 1.];

                            f = Interpolation[Transpose[binboundaries, Range[0, m]], InterpolationOrder -> 0];


                            Now you can apply it to lists of values as follows:



                            vals = RandomReal[-1, 1, 1000]; 
                            Round[f[vals]]






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Apr 9 at 6:05









                            Henrik SchumacherHenrik Schumacher

                            61.4k585171




                            61.4k585171



























                                draft saved

                                draft discarded
















































                                Thanks for contributing an answer to Mathematica Stack Exchange!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid


                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.

                                Use MathJax to format equations. MathJax reference.


                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function ()
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f194844%2fmap-list-to-bin-numbers%23new-answer', 'question_page');

                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                Popular posts from this blog

                                Adding axes to figuresAdding axes labels to LaTeX figuresLaTeX equivalent of ConTeXt buffersRotate a node but not its content: the case of the ellipse decorationHow to define the default vertical distance between nodes?TikZ scaling graphic and adjust node position and keep font sizeNumerical conditional within tikz keys?adding axes to shapesAlign axes across subfiguresAdding figures with a certain orderLine up nested tikz enviroments or how to get rid of themAdding axes labels to LaTeX figures

                                Tähtien Talli Jäsenet | Lähteet | NavigointivalikkoSuomen Hippos – Tähtien Talli

                                Do these cracks on my tires look bad? The Next CEO of Stack OverflowDry rot tire should I replace?Having to replace tiresFishtailed so easily? Bad tires? ABS?Filling the tires with something other than air, to avoid puncture hassles?Used Michelin tires safe to install?Do these tyre cracks necessitate replacement?Rumbling noise: tires or mechanicalIs it possible to fix noisy feathered tires?Are bad winter tires still better than summer tires in winter?Torque converter failure - Related to replacing only 2 tires?Why use snow tires on all 4 wheels on 2-wheel-drive cars?