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 '18 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 '18 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 '18 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 '18 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 '18 at 8:02









Divakar

154k1483172




154k1483172










asked Nov 23 '18 at 7:51









M.SidorenkoM.Sidorenko

214




214








  • 2




    Possible duplicate of Get original indices of a sorted Numpy array
    – Rahul Agarwal
    Nov 23 '18 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 '18 at 8:04
















  • 2




    Possible duplicate of Get original indices of a sorted Numpy array
    – Rahul Agarwal
    Nov 23 '18 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 '18 at 8:04










2




2




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




Possible duplicate of Get original indices of a sorted Numpy array
– Rahul Agarwal
Nov 23 '18 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 '18 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 '18 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 '18 at 7:58









          DivakarDivakar

          154k1483172




          154k1483172

























              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 '18 at 8:04









                  DLMDLM

                  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

                      Berounka

                      Sphinx de Gizeh

                      Different font size/position of beamer's navigation symbols template's content depending on regular/plain...