[Python] вопрос/ответ.

Discussion in 'Python' started by De-visible, 21 Jan 2009.

  1. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    264
    Likes Received:
    146
    Reputations:
    3
    ПОмогите срочно !!! Есть массив координат например [(0, 1), (20, 25), (52, 56), (21, 9), (35, 513)] , мне надо его отсортировать по самой близкой координате. Приму любые варианты, ЛЮБЫЕ. Заранее спасибо за внимание !!!!
     
    1. 4Fun

      4Fun Elder - Старейшина

      Joined:
      25 Jul 2018
      Messages:
      496
      Likes Received:
      709
      Reputations:
      11
      Насколько я понимаю, вам нужно отсортировать координаты в списке по убыванию расстояния от центра координатной плоскости (точка с координатами (0; 0)). В таком случае нужно воспользоваться формулой расстояния между двумя точками на плоскости (также известна как формула длины двухмерного вектора):
      [​IMG]
      Поскольку, центр — точка (x0; y0) с координатами (0; 0), формула упрощается:
      sqrt((x-x0)**2 + (y-y0)**2) -> sqrt(x**2 + y**2)
      Метод list.sort() имеет параметр key, который принимает функцию сортировки.
      Пишем функцию сортировки:
      Code:
      import math
      
      def sortKey(value):
          x, y = value
          d = math.sqrt(x**2 + y**2)
          return d
      Сортируем:
      Code:
      coords = [(0, 1), (20, 25), (52, 56), (21, 9), (35, 513)]
      coords.sort(key=sortKey)
      print(coords)
      Более простой вариант с использованием анонимной функции:
      Code:
      import math
      coords = [(0, 1), (20, 25), (52, 56), (21, 9), (35, 513)]
      coords.sort(key=lambda c: math.sqrt(c[0]**2 + c[1]**2))
      print(coords)
      Результат:
      [(0, 1), (21, 9), (20, 25), (52, 56), (35, 513)]
       
      #1142 4Fun, 3 Sep 2020
      Last edited: 3 Sep 2020
      nynenado and Matrix001 like this.
      1. Matrix001

        Matrix001 Active Member

        Joined:
        18 Aug 2016
        Messages:
        264
        Likes Received:
        146
        Reputations:
        3
        Я сегодня поэксперементировал, это не совсем то что мне подходит
         
        1. 4Fun

          4Fun Elder - Старейшина

          Joined:
          25 Jul 2018
          Messages:
          496
          Likes Received:
          709
          Reputations:
          11
          Прошу тогда нормально изложить вопрос. Можно описать задачу полностью.
           
          1. Matrix001

            Matrix001 Active Member

            Joined:
            18 Aug 2016
            Messages:
            264
            Likes Received:
            146
            Reputations:
            3
            Есть допустим эти точки. [​IMG]
            Эта сортировка будет соединять их где-то так
            [​IMG]
            А мне нужно что бы после сортировки точки были отсортированы таким образом, что бы я мог соединять их так
            [​IMG]
             
            1. 4Fun

              4Fun Elder - Старейшина

              Joined:
              25 Jul 2018
              Messages:
              496
              Likes Received:
              709
              Reputations:
              11
              @Matrix001
              Вы говорите не о сортировке, о задаче на построение выпуклой оболочки. Решается она через подзадачу: определение положения точки относительно вектора: https://acmp.ru/article.asp?id_text=172
              Алгоритм вкратце: выбираем любую точку A из множества точек, затем выбираем любую точку B, строим вектор AB, затем в цикле проверяем положение всех оставшихся точек относительно вектора AB. Допустиим, будем строить оболочку по часовой стрелке, тогда все остальные точки должны быть по правую сторону вектора. Если какая-либо точка оказывается по левую сторону — прерываем цикл и выбираем другую точку B, затем снова проверяем положение остальных точек относительно вектора AB. И так до тех пор, пока не будет выбрана верная точка B. После этого выбираем точку C и повторяем действия с вектором BC. Повторяем алгоритм до тех пор, пока не задействуем все точки. После этого соединяем две оставшиеся, замыкая оболочку.
              Возможно, набросаю код, но чуть позже.
               
              #1146 4Fun, 5 Sep 2020
              Last edited: 5 Sep 2020
              Svan, fandor9 and Matrix001 like this.
              1. Matrix001

                Matrix001 Active Member

                Joined:
                18 Aug 2016
                Messages:
                264
                Likes Received:
                146
                Reputations:
                3
                Спасибо, очень помогаете !
                 
                1. Matrix001

                  Matrix001 Active Member

                  Joined:
                  18 Aug 2016
                  Messages:
                  264
                  Likes Received:
                  146
                  Reputations:
                  3
                  Может уже как-то получиться показать код на python-е ? Я у себя использовал эту функцию
                  Code:
                  def cc(crd, crds, index, r=1):
                      size = 300, 401
                      tarr = []
                  
                      res = False
                  
                      for x in range(crd[0]+r, crd[0]+r+1):
                          for y in range(crd[1] - r, crd[1] + r + 1):
                              if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                                  tarr.append((x, y))
                  
                      for x in range(crd[0]-r, (crd[0]-r)+1):
                          for y in range(crd[1] - r, crd[1] + r + 1):
                              if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                                  tarr.append((x, y))
                  
                      for y in range(crd[1]-r, (crd[1]-r)+1):
                          for x in range(crd[0] - r, crd[0] + r + 1):
                              if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                                  tarr.append((x, y))
                  
                      for y in range(crd[1]+r, (crd[1]+r)+1):
                          for x in range(crd[0] - r, crd[0] + r + 1):
                              if x < size[0] and x >= 0 and y < size[1] and y >= 0 and crd != (x, y):
                                  tarr.append((x, y))
                  
                      for i in range(0, len(tarr)):
                          if tarr[i] in crds:
                              res = True
                              draw.line((crd[0], crd[1], tarr[i][0], tarr[i][1]), fill=index) #грубо
                              break
                  
                      return res
                  Она просто берет от координаты допусти (1,1) соседнии пиксели по радиусу (включая по диагонали) и если есть такая координата в массиве с уже существующими координтами, то рисует (грубо) линию. Но это конечно происходит сначало с радиусом 1-н, потом радиус увеличивается пока не будет найдена та точка. Это мне намного лучше конечно помогает, получается довольно та ки прикольно. Но наверное то что ты писал, будет намного лучше ??? И да, мой алгоритм таков, что я не могу использовать многопоточность, потому что у меня все должно выполнятся линейно, то есть, бесмысленно мне делать даже так что создавать массив из 256-х, а потом уже из него все заменять. Это будет даже дольше.

                  [​IMG]
                  [​IMG]
                   
                  1. Matrix001

                    Matrix001 Active Member

                    Joined:
                    18 Aug 2016
                    Messages:
                    264
                    Likes Received:
                    146
                    Reputations:
                    3
                    Как я могу в OpenCV сделать свой собственный фильтр на два изображения ? Например у меня есть первое изображение и второе изображение. Я хочу что бы в результате сравнения этих двух изображений получилось изображение из максимального значения, как это сделать в OpenCV ?
                     
                    1. Matrix001

                      Matrix001 Active Member

                      Joined:
                      18 Aug 2016
                      Messages:
                      264
                      Likes Received:
                      146
                      Reputations:
                      3
                      Я немного разобрался, хотелось бы посмотреть на код, потому что я не совсем понимаю как будет делаться такое прохождение для каждой точки если учесть что расположение точек может быть рандомным и не все "круги" должны быть замкнуты
                       
                      1. Hohol99

                        Hohol99 Member

                        Joined:
                        7 Apr 2020
                        Messages:
                        61
                        Likes Received:
                        17
                        Reputations:
                        0
                        Есть такая формула x^2 + y^2 = R^2 - если у вас в задаче координаты вида (x,y) можно использовать ее, а точнее - вывести R (радиус) и найти минимальный.
                         
                        1. zak_guen

                          zak_guen New Member

                          Joined:
                          9 Aug 2021
                          Messages:
                          2
                          Likes Received:
                          0
                          Reputations:
                          0
                          тут нужна помощь со скриптом, https://forum.antichat.ru/threads/484619/
                           
                          #1152 zak_guen, 27 Aug 2021
                          Last edited: 27 Aug 2021
                          1. big-boss777

                            big-boss777 New Member

                            Joined:
                            26 Sep 2022
                            Messages:
                            2
                            Likes Received:
                            0
                            Reputations:
                            0
                            Здравствуйте.
                            Пытаюсь реализовать алгоритм решения системы линейных уравнений согласно методу Крамера.
                            Возможно, кто-то встречался с такой проблемой. Пршу помочь.
                             
                            1. #colorblind

                              #colorblind Moderator

                              Joined:
                              31 Jan 2014
                              Messages:
                              637
                              Likes Received:
                              246
                              Reputations:
                              42
                              https://rosettacode.org/wiki/Cramer's_rule#Python
                               
                              big-boss777 likes this.
                              1. big-boss777

                                big-boss777 New Member

                                Joined:
                                26 Sep 2022
                                Messages:
                                2
                                Likes Received:
                                0
                                Reputations:
                                0
                                Спасибо.
                                 
                                1. Matrix001

                                  Matrix001 Active Member

                                  Joined:
                                  18 Aug 2016
                                  Messages:
                                  264
                                  Likes Received:
                                  146
                                  Reputations:
                                  3
                                  В photoshop есть режим цвета как "Индексированные цвета".

                                  [​IMG]
                                  В этом режиме подбирается оптимально ограниченное количество цветов (например 256). Можно выбирать разную палитру.
                                  [​IMG]
                                  Как это реализовать в python 3.x с использованием numpy+opencv где палитра будет выстраиваться по индексам цветов этого изображения в градациях серого ?

                                  P.S: То есть где каждое значение пикслея изображения в градациях серого от 0 до 255 будет присвоен свой цвет.
                                  Реально ли такое ? Я пробовал лишь усреднение цветов, что дает плохой результат.
                                  Также не помогает HSV и HLS !
                                  Заранее спасибо за любую помощь !!! Могу заплатить 300 р за ответ.
                                   
                                  #1156 Matrix001, 22 Oct 2022
                                  Last edited: 22 Oct 2022
                                  1. #colorblind

                                    #colorblind Moderator

                                    Joined:
                                    31 Jan 2014
                                    Messages:
                                    637
                                    Likes Received:
                                    246
                                    Reputations:
                                    42
                                    https://stackoverflow.com/questions/42750910/convert-rgb-image-to-index-image
                                     
                                    1. Matrix001

                                      Matrix001 Active Member

                                      Joined:
                                      18 Aug 2016
                                      Messages:
                                      264
                                      Likes Received:
                                      146
                                      Reputations:
                                      3
                                      Ха, это вообще не то (хотя проблема в иной сфере таже и не решена как видно)...
                                      Причем здесь цвета и индексы (мне не нужно переводить цвета в индексы для превращения изображения в градации сеорого).
                                      Мне нужно что бы цвета (ограниченного количества) подбирались к значениям (изображения оригинального с полной RGB переведенного из цветного в градации серого ПРОСТЫМ УСРЕДНЕНИЕМ ВСЕХ КАНАЛОВ как обычно) так что бы это было понятное изображение а не бредятина (пробовал больше 4 способов присвоить цвета после индекса к значениям усредненного оригинального изображения (градации сеорго) получалось сплошное г***) ...
                                      Photoshop со своими индексами цветами просто подбирает цвета по ограниченному количеству так что бы было приблизно соответствие к оригинальному цвету пикселя, но не учитывает индекс по изображению в градациях серого.
                                      Понятное, что невозможно использовать все 0...255 значений в градациях сеорого изображения если в изображении всего 3 цвета допустим (там будет простая нормализация по индексам градаций серого изображения я так себе это представляю), но я думаю это реально если в изображении их >= 256.
                                      Наверное я пытаюсь решить то что стоилобы милиарды, и то что способно сократить размер любого изображения в 100 раз без потери качества вообще.
                                      Но мне это нужно для других целей.
                                       
                                      #1158 Matrix001, 27 Oct 2022
                                      Last edited: 27 Oct 2022
                                      1. Matrix001

                                        Matrix001 Active Member

                                        Joined:
                                        18 Aug 2016
                                        Messages:
                                        264
                                        Likes Received:
                                        146
                                        Reputations:
                                        3
                                        Может кто знает ...
                                        есть массив
                                        a = [
                                        [1,2]
                                        ]
                                        и
                                        b = [
                                        [[0,0,0],[0,0,0]]
                                        ]

                                        Как вставить в массив b по индексам из массива a единицы ? То есть должен получится следующий массив

                                        r = [
                                        [[0,1,0],[0,0,1]]
                                        ]
                                         
                                        1. V777

                                          V777 Elder - Старейшина

                                          Joined:
                                          12 May 2015
                                          Messages:
                                          1,310
                                          Likes Received:
                                          3,179
                                          Reputations:
                                          24
                                          a = [[1, 2]]
                                          b = [[[0, 0, 0], [0, 0, 0]]]
                                          for i, j in a:
                                          b[j] = 1
                                          b[j][j+1] = 1
                                          print(b)