Извлечь первый элемент из (x, y) координатного массива numpy - PullRequest
0 голосов
/ 14 октября 2019

Мы пытаемся создать группу координат, которые находятся в непосредственной близости друг от друга. Для создания этой группы нам нужно сравнить координаты x, y массива numpy с первым элементом в массиве.

Если они совпадают, мы сохраняем это в одном в существующем массиве, а если нет, мы создаем новый и сохраняем их там.

Мы попробовали это с циклом for и извлекли x и yотдельно. Но это не сработало.


mport numpy as np 

coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
              (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
              (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
              (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
              (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
              (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
              (994.0796,1591.2533),(539.5005,1862.1327)] 

seen = set() 

newlist = [] 

for item in coordinates: 
    t = tuple(item) 
    if t not in seen: 
        newlist.append(item) 
        seen.add(t) 

npArray = np.array(newlist) 
newlist = npArray.astype(int) 
npArray2 = np.array(newlist) 
coordinates1 = npArray2.astype(int) 

for i in coordinates1[0]: 
    print(i[0])

Мы пытаемся получить 1-й элемент координат в сообщении выше в отдельной переменной.

В настоящее время мы получаем ошибку: IndexError: недопустимый индекс для скалярной переменной.

Мы новички в python, поэтому любые рекомендации будут полезны, даже если указатель на лучший способ сделать это.

Спасибо!


Спасибо за все ответы. Я думаю, что моя ошибка в том, что я не объяснил вопрос. Я попытаюсь здесь снова:

coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
              (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
              (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
              (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
              (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
              (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
              (994.0796,1591.2533),(539.5005,1862.1327)] 

Мы пытаемся создать группы координат, которые находятся в пределах / в пределах 30 точек + или - 1-го координата в приведенном выше списке.

Итак, для этого нам нужно будет сравнить все координаты (x, y) одну за другой с 1-й координатой, и если они находятся выше указанного диапазона, мы назначим их группе (например,G1) / массив с 1-й координатой в качестве 1-го элемента в этой группе.

Если не в диапазоне, мы создадим другую группу (например, G2) / массив и вставим координату вне диапазона в этой новой группе.

Таким образом, мы продолжаем сравнивать один за другим каждый элемент в вышеприведенном списке, пока все координаты не сравнятся и не будут отнесены к одной из групп.

Надеюсь, я прояснил это.

Большое спасибо за вашу помощь!

С наилучшими пожеланиями,

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

Я не понял, что вы имели в виду, но попробуйте это:

import numpy as np 

coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
              (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
              (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
              (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
              (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
              (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
              (994.0796,1591.2533),(539.5005,1862.1327)] 

seen = set()
newlist = [] 

for item in coordinates: 
    t = tuple(item) 
    if t not in seen: 
        newlist.append(item) 
        seen.add(t) 

npArray = np.array(newlist) 
newlist = npArray.astype(int) 

for i in newlist: 
    print(i)
0 голосов
/ 14 октября 2019

Поскольку вы ищете точки внутри круга, здесь вы можете найти способ сделать это. Вам нужно будет адаптировать его к вашим потребностям, которые не очень понятны.

import numpy as np

coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
              (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
              (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
              (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
              (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
              (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
              (994.0796,1591.2533),(539.5005,1862.1327)]

reference = (580.4625,201.87183)
z = 30 # Radius

L1 = list()
L2 = list()

for coord in coordinates:
    # coord is a tuple of 2 values, x and y.
    x = coord[0]
    y = coord[1]

    # Compute distance in 2D space
    d = np.sqrt((x-reference[0])**2+(y-reference[1])**2)

    # Add to the correct list
    if d <= z:
        L1.append(coord)
    else:
        L2.append(coord)

Кроме того, эти шаги могут быть выполнены с использованием списка, который дает вам одну строку:

L1 = [coord for coord in coordinates if np.sqrt((coord[0]-reference[0])**2+(coord[1]-reference[1])**2) <= z]
L2 = [coord for coord in coordinates if not np.sqrt((coord[0]-reference[0])**2+(coord[1]-reference[1])**2) <= z]

Теперь, предполагая, что вы хотите выполнить цикл по координатам, и каждый раз создавать список ближайших точек L1, т.е. создавать кластер точек в радиусе z = 30 от рассматриваемой координаты, вы можете создать список clusterи добавляйте каждый раз список ближайших точек.

import numpy as np

coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
              (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
              (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
              (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
              (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
              (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
              (994.0796,1591.2533),(539.5005,1862.1327)]

z = 30 # Radius
clusters = list()

for ref in coordinates:
    # coord is a tuple of 2 values, x and y.
    x = ref[0]
    y = ref[1]

    clusters.append([coord for coord in coordinates \
          if np.sqrt((coord[0]-x)**2+(coord[1]-y)**2) <= z])

При использовании этого метода, если точка находится в диапазоне 2 кластеров, она будет включена в обе.

Addtionnaly,некоторые точки присутствуют дважды в координатах. Чтобы удалить дубликаты, вы можете использовать set.

coordinates = list(set(coordinates))

Пример кластера. Элемент (167.84459,701.64935) ведет к кластеру [(167.84459, 701.64935), (167.84459, 694.65247)] (с учетом дубликатов).

enter image description here

0 голосов
/ 14 октября 2019

Попробуйте, это работает,

    for i in coordinates1: 
        print(i[0])

, поскольку форма координат массива 1 равна (9,2), для доступа к координате x не нужны координаты [0].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...