delete zeros from a SparseArray












1














Why doesn't SparseArray automatically remove zero entries? The code



a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
r = DeleteCases[a-b,0]
r //ArrayRules


returns {{1}->-11,{3}->0,{5}->0,{7}->0,{9}->-99,{11}->0,{2}->22,{13}->1313,{_}->0} instead of {{1}->-11,{9}->-99,{2}->22,{13}->1313,{_}->0}.



Is there a nice way to get rid of zero entries? For instance, if on $A!in!mathbb{Z}^{mtimes n}_2$ I perform Gaussian elimination, I use A=Mod[A,2];, suddenly many entries are zero and I don't want to waste memory on them.
Of course I could use A=SparseArray[DeleteCases[ArrayRules[A],#[[2]]==0&],{m,n}], but it seems clumsy to use this often...



Also, if I have a very long sparse row that gets updated frequently and fills up somewhat (Gaussian elimination), is it better to use SparseArray with + or Association with Merge?










share|improve this question


















  • 1




    Possible duplicate of How to prevent a SparseArray entry from being specified when it coincides with the default value?
    – MeMyselfI
    3 hours ago










  • It does not do it automatically because rebuilding a sparse array is expensive. It is left to you to decide when you want to rebuild it and eliminate unnecessary entries. Just apply SparseArray again.
    – Szabolcs
    1 hour ago
















1














Why doesn't SparseArray automatically remove zero entries? The code



a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
r = DeleteCases[a-b,0]
r //ArrayRules


returns {{1}->-11,{3}->0,{5}->0,{7}->0,{9}->-99,{11}->0,{2}->22,{13}->1313,{_}->0} instead of {{1}->-11,{9}->-99,{2}->22,{13}->1313,{_}->0}.



Is there a nice way to get rid of zero entries? For instance, if on $A!in!mathbb{Z}^{mtimes n}_2$ I perform Gaussian elimination, I use A=Mod[A,2];, suddenly many entries are zero and I don't want to waste memory on them.
Of course I could use A=SparseArray[DeleteCases[ArrayRules[A],#[[2]]==0&],{m,n}], but it seems clumsy to use this often...



Also, if I have a very long sparse row that gets updated frequently and fills up somewhat (Gaussian elimination), is it better to use SparseArray with + or Association with Merge?










share|improve this question


















  • 1




    Possible duplicate of How to prevent a SparseArray entry from being specified when it coincides with the default value?
    – MeMyselfI
    3 hours ago










  • It does not do it automatically because rebuilding a sparse array is expensive. It is left to you to decide when you want to rebuild it and eliminate unnecessary entries. Just apply SparseArray again.
    – Szabolcs
    1 hour ago














1












1








1







Why doesn't SparseArray automatically remove zero entries? The code



a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
r = DeleteCases[a-b,0]
r //ArrayRules


returns {{1}->-11,{3}->0,{5}->0,{7}->0,{9}->-99,{11}->0,{2}->22,{13}->1313,{_}->0} instead of {{1}->-11,{9}->-99,{2}->22,{13}->1313,{_}->0}.



Is there a nice way to get rid of zero entries? For instance, if on $A!in!mathbb{Z}^{mtimes n}_2$ I perform Gaussian elimination, I use A=Mod[A,2];, suddenly many entries are zero and I don't want to waste memory on them.
Of course I could use A=SparseArray[DeleteCases[ArrayRules[A],#[[2]]==0&],{m,n}], but it seems clumsy to use this often...



Also, if I have a very long sparse row that gets updated frequently and fills up somewhat (Gaussian elimination), is it better to use SparseArray with + or Association with Merge?










share|improve this question













Why doesn't SparseArray automatically remove zero entries? The code



a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
r = DeleteCases[a-b,0]
r //ArrayRules


returns {{1}->-11,{3}->0,{5}->0,{7}->0,{9}->-99,{11}->0,{2}->22,{13}->1313,{_}->0} instead of {{1}->-11,{9}->-99,{2}->22,{13}->1313,{_}->0}.



Is there a nice way to get rid of zero entries? For instance, if on $A!in!mathbb{Z}^{mtimes n}_2$ I perform Gaussian elimination, I use A=Mod[A,2];, suddenly many entries are zero and I don't want to waste memory on them.
Of course I could use A=SparseArray[DeleteCases[ArrayRules[A],#[[2]]==0&],{m,n}], but it seems clumsy to use this often...



Also, if I have a very long sparse row that gets updated frequently and fills up somewhat (Gaussian elimination), is it better to use SparseArray with + or Association with Merge?







matrix associations sparse-arrays rule






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 7 hours ago









Leon

347111




347111








  • 1




    Possible duplicate of How to prevent a SparseArray entry from being specified when it coincides with the default value?
    – MeMyselfI
    3 hours ago










  • It does not do it automatically because rebuilding a sparse array is expensive. It is left to you to decide when you want to rebuild it and eliminate unnecessary entries. Just apply SparseArray again.
    – Szabolcs
    1 hour ago














  • 1




    Possible duplicate of How to prevent a SparseArray entry from being specified when it coincides with the default value?
    – MeMyselfI
    3 hours ago










  • It does not do it automatically because rebuilding a sparse array is expensive. It is left to you to decide when you want to rebuild it and eliminate unnecessary entries. Just apply SparseArray again.
    – Szabolcs
    1 hour ago








1




1




Possible duplicate of How to prevent a SparseArray entry from being specified when it coincides with the default value?
– MeMyselfI
3 hours ago




Possible duplicate of How to prevent a SparseArray entry from being specified when it coincides with the default value?
– MeMyselfI
3 hours ago












It does not do it automatically because rebuilding a sparse array is expensive. It is left to you to decide when you want to rebuild it and eliminate unnecessary entries. Just apply SparseArray again.
– Szabolcs
1 hour ago




It does not do it automatically because rebuilding a sparse array is expensive. It is left to you to decide when you want to rebuild it and eliminate unnecessary entries. Just apply SparseArray again.
– Szabolcs
1 hour ago










1 Answer
1






active

oldest

votes


















4














You can just apply SparseArray to a SparseArray object to normalize it. For your example:



a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
r = DeleteCases[a-b,0];

SparseArray[r] //ArrayRules



{{1} -> -11, {2} -> 22, {9} -> -99, {13} -> 1313, {_} -> 0}







share|improve this answer





















    Your Answer





    StackExchange.ifUsing("editor", function () {
    return StackExchange.using("mathjaxEditing", function () {
    StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
    StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
    });
    });
    }, "mathjax-editing");

    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%2f188581%2fdelete-zeros-from-a-sparsearray%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    4














    You can just apply SparseArray to a SparseArray object to normalize it. For your example:



    a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
    b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
    r = DeleteCases[a-b,0];

    SparseArray[r] //ArrayRules



    {{1} -> -11, {2} -> 22, {9} -> -99, {13} -> 1313, {_} -> 0}







    share|improve this answer


























      4














      You can just apply SparseArray to a SparseArray object to normalize it. For your example:



      a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
      b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
      r = DeleteCases[a-b,0];

      SparseArray[r] //ArrayRules



      {{1} -> -11, {2} -> 22, {9} -> -99, {13} -> 1313, {_} -> 0}







      share|improve this answer
























        4












        4








        4






        You can just apply SparseArray to a SparseArray object to normalize it. For your example:



        a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
        b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
        r = DeleteCases[a-b,0];

        SparseArray[r] //ArrayRules



        {{1} -> -11, {2} -> 22, {9} -> -99, {13} -> 1313, {_} -> 0}







        share|improve this answer












        You can just apply SparseArray to a SparseArray object to normalize it. For your example:



        a = SparseArray[{2->22,3->33,5->55,7->77,11->1111,13->1313},13];
        b = SparseArray[{1->11,3->33,5->55,7->77,9->99,11->1111},13];
        r = DeleteCases[a-b,0];

        SparseArray[r] //ArrayRules



        {{1} -> -11, {2} -> 22, {9} -> -99, {13} -> 1313, {_} -> 0}








        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 7 hours ago









        Carl Woll

        67k387175




        67k387175






























            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.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • 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.


            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%2f188581%2fdelete-zeros-from-a-sparsearray%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

            Morgemoulin

            Scott Moir

            Souastre