Find positions of elements in sorted array












1














Suppose I have some numpy array (all elements are unique) that I want to sort in descending order. I need to find out which positions elements of initial array will take in sorted array.



Example.



In1: [1, 2, 3] # Input

Out1: [2, 1, 0] # Expected output

In2: [1, -2, 2] # Input

Out2: [1, 2, 0] # Expected output


I tried this one:



def find_positions(A):
A = np.array(A)
A_sorted = np.sort(A)[::-1]
return np.argwhere(A[:, None] == A_sorted[None, :])[:, 1]


But it doesn't work when the input array is very large (len > 100000). What I did wrong and how can I resolve it?










share|improve this question




















  • 2




    Possible duplicate of Get original indices of a sorted Numpy array
    – Rahul Agarwal
    Nov 23 at 7:59










  • @RahulAgarwal Not a duplicate because we are trying to trace back the index positions in the sorted array against the original order. Simply using argsort as suggested in the linked dup target won't work here.
    – Divakar
    Nov 23 at 8:04


















1














Suppose I have some numpy array (all elements are unique) that I want to sort in descending order. I need to find out which positions elements of initial array will take in sorted array.



Example.



In1: [1, 2, 3] # Input

Out1: [2, 1, 0] # Expected output

In2: [1, -2, 2] # Input

Out2: [1, 2, 0] # Expected output


I tried this one:



def find_positions(A):
A = np.array(A)
A_sorted = np.sort(A)[::-1]
return np.argwhere(A[:, None] == A_sorted[None, :])[:, 1]


But it doesn't work when the input array is very large (len > 100000). What I did wrong and how can I resolve it?










share|improve this question




















  • 2




    Possible duplicate of Get original indices of a sorted Numpy array
    – Rahul Agarwal
    Nov 23 at 7:59










  • @RahulAgarwal Not a duplicate because we are trying to trace back the index positions in the sorted array against the original order. Simply using argsort as suggested in the linked dup target won't work here.
    – Divakar
    Nov 23 at 8:04
















1












1








1







Suppose I have some numpy array (all elements are unique) that I want to sort in descending order. I need to find out which positions elements of initial array will take in sorted array.



Example.



In1: [1, 2, 3] # Input

Out1: [2, 1, 0] # Expected output

In2: [1, -2, 2] # Input

Out2: [1, 2, 0] # Expected output


I tried this one:



def find_positions(A):
A = np.array(A)
A_sorted = np.sort(A)[::-1]
return np.argwhere(A[:, None] == A_sorted[None, :])[:, 1]


But it doesn't work when the input array is very large (len > 100000). What I did wrong and how can I resolve it?










share|improve this question















Suppose I have some numpy array (all elements are unique) that I want to sort in descending order. I need to find out which positions elements of initial array will take in sorted array.



Example.



In1: [1, 2, 3] # Input

Out1: [2, 1, 0] # Expected output

In2: [1, -2, 2] # Input

Out2: [1, 2, 0] # Expected output


I tried this one:



def find_positions(A):
A = np.array(A)
A_sorted = np.sort(A)[::-1]
return np.argwhere(A[:, None] == A_sorted[None, :])[:, 1]


But it doesn't work when the input array is very large (len > 100000). What I did wrong and how can I resolve it?







python numpy






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 23 at 8:02









Divakar

154k1481170




154k1481170










asked Nov 23 at 7:51









M.Sidorenko

214




214








  • 2




    Possible duplicate of Get original indices of a sorted Numpy array
    – Rahul Agarwal
    Nov 23 at 7:59










  • @RahulAgarwal Not a duplicate because we are trying to trace back the index positions in the sorted array against the original order. Simply using argsort as suggested in the linked dup target won't work here.
    – Divakar
    Nov 23 at 8:04
















  • 2




    Possible duplicate of Get original indices of a sorted Numpy array
    – Rahul Agarwal
    Nov 23 at 7:59










  • @RahulAgarwal Not a duplicate because we are trying to trace back the index positions in the sorted array against the original order. Simply using argsort as suggested in the linked dup target won't work here.
    – Divakar
    Nov 23 at 8:04










2




2




Possible duplicate of Get original indices of a sorted Numpy array
– Rahul Agarwal
Nov 23 at 7:59




Possible duplicate of Get original indices of a sorted Numpy array
– Rahul Agarwal
Nov 23 at 7:59












@RahulAgarwal Not a duplicate because we are trying to trace back the index positions in the sorted array against the original order. Simply using argsort as suggested in the linked dup target won't work here.
– Divakar
Nov 23 at 8:04






@RahulAgarwal Not a duplicate because we are trying to trace back the index positions in the sorted array against the original order. Simply using argsort as suggested in the linked dup target won't work here.
– Divakar
Nov 23 at 8:04














2 Answers
2






active

oldest

votes


















2














Approach #1



We could use double argsort -



np.argsort(a)[::-1].argsort() # a is input array/list


Approach #2



We could use one argsort and then array-assignment -



# https://stackoverflow.com/a/41242285/ @Andras Deak
def argsort_unique(idx):
n = idx.size
sidx = np.empty(n,dtype=int)
sidx[idx] = np.arange(n)
return sidx

out = argsort_unique(np.argsort(a)[::-1])





share|improve this answer





























    0














    Take a look at numpy.argsort(...) function:




    Returns the indices that would sort an array.



    Perform an indirect sort along the given axis using the algorithm specified by the kind keyword. It returns an array of indices of the same shape as a that index data along the given axis in sorted order.




    Here is the reference from the documentation, and the following is a simple example:



    import numpy
    arr = numpy.random.rand(100000)
    indexes = numpy.argsort(arr)


    the indexes array will contain all the indexes in the order in which the array arr would be sorted






    share|improve this answer





















      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      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: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      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%2fstackoverflow.com%2fquestions%2f53442599%2ffind-positions-of-elements-in-sorted-array%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      2














      Approach #1



      We could use double argsort -



      np.argsort(a)[::-1].argsort() # a is input array/list


      Approach #2



      We could use one argsort and then array-assignment -



      # https://stackoverflow.com/a/41242285/ @Andras Deak
      def argsort_unique(idx):
      n = idx.size
      sidx = np.empty(n,dtype=int)
      sidx[idx] = np.arange(n)
      return sidx

      out = argsort_unique(np.argsort(a)[::-1])





      share|improve this answer


























        2














        Approach #1



        We could use double argsort -



        np.argsort(a)[::-1].argsort() # a is input array/list


        Approach #2



        We could use one argsort and then array-assignment -



        # https://stackoverflow.com/a/41242285/ @Andras Deak
        def argsort_unique(idx):
        n = idx.size
        sidx = np.empty(n,dtype=int)
        sidx[idx] = np.arange(n)
        return sidx

        out = argsort_unique(np.argsort(a)[::-1])





        share|improve this answer
























          2












          2








          2






          Approach #1



          We could use double argsort -



          np.argsort(a)[::-1].argsort() # a is input array/list


          Approach #2



          We could use one argsort and then array-assignment -



          # https://stackoverflow.com/a/41242285/ @Andras Deak
          def argsort_unique(idx):
          n = idx.size
          sidx = np.empty(n,dtype=int)
          sidx[idx] = np.arange(n)
          return sidx

          out = argsort_unique(np.argsort(a)[::-1])





          share|improve this answer












          Approach #1



          We could use double argsort -



          np.argsort(a)[::-1].argsort() # a is input array/list


          Approach #2



          We could use one argsort and then array-assignment -



          # https://stackoverflow.com/a/41242285/ @Andras Deak
          def argsort_unique(idx):
          n = idx.size
          sidx = np.empty(n,dtype=int)
          sidx[idx] = np.arange(n)
          return sidx

          out = argsort_unique(np.argsort(a)[::-1])






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 23 at 7:58









          Divakar

          154k1481170




          154k1481170

























              0














              Take a look at numpy.argsort(...) function:




              Returns the indices that would sort an array.



              Perform an indirect sort along the given axis using the algorithm specified by the kind keyword. It returns an array of indices of the same shape as a that index data along the given axis in sorted order.




              Here is the reference from the documentation, and the following is a simple example:



              import numpy
              arr = numpy.random.rand(100000)
              indexes = numpy.argsort(arr)


              the indexes array will contain all the indexes in the order in which the array arr would be sorted






              share|improve this answer


























                0














                Take a look at numpy.argsort(...) function:




                Returns the indices that would sort an array.



                Perform an indirect sort along the given axis using the algorithm specified by the kind keyword. It returns an array of indices of the same shape as a that index data along the given axis in sorted order.




                Here is the reference from the documentation, and the following is a simple example:



                import numpy
                arr = numpy.random.rand(100000)
                indexes = numpy.argsort(arr)


                the indexes array will contain all the indexes in the order in which the array arr would be sorted






                share|improve this answer
























                  0












                  0








                  0






                  Take a look at numpy.argsort(...) function:




                  Returns the indices that would sort an array.



                  Perform an indirect sort along the given axis using the algorithm specified by the kind keyword. It returns an array of indices of the same shape as a that index data along the given axis in sorted order.




                  Here is the reference from the documentation, and the following is a simple example:



                  import numpy
                  arr = numpy.random.rand(100000)
                  indexes = numpy.argsort(arr)


                  the indexes array will contain all the indexes in the order in which the array arr would be sorted






                  share|improve this answer












                  Take a look at numpy.argsort(...) function:




                  Returns the indices that would sort an array.



                  Perform an indirect sort along the given axis using the algorithm specified by the kind keyword. It returns an array of indices of the same shape as a that index data along the given axis in sorted order.




                  Here is the reference from the documentation, and the following is a simple example:



                  import numpy
                  arr = numpy.random.rand(100000)
                  indexes = numpy.argsort(arr)


                  the indexes array will contain all the indexes in the order in which the array arr would be sorted







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 23 at 8:04









                  DLM

                  584




                  584






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


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





                      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%2fstackoverflow.com%2fquestions%2f53442599%2ffind-positions-of-elements-in-sorted-array%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

                      Contact image not getting when fetch all contact list from iPhone by CNContact

                      count number of partitions of a set with n elements into k subsets

                      A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks