Find positions of elements in sorted array





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







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

160k1494187




160k1494187










asked Nov 23 '18 at 7:51









M.SidorenkoM.Sidorenko

194




194








  • 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

          160k1494187




          160k1494187

























              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

                  684




                  684






























                      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.




                      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

                      Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

                      ComboBox Display Member on multiple fields

                      Is it possible to collect Nectar points via Trainline?