Я хочу сравнить двумерный массив Numpy, чтобы найти, что данные находятся в диапазоне или нет, если да, чем они должны быть добавлены в новую группу - PullRequest
0 голосов
/ 30 октября 2019

Я хочу сравнить 2d массив numpy с одним x_min, x_max и таким же для значения y, но я не понял концепцию цикла в этом случае, как определить цикл для сравнения и использовать numpy.where_logical_and.

import numpy as np

group_count = 0
xy = np.array([[116,2306],[118,2307],[126,1517]])
idx = np.array([[0,0],[0,1]])
group1 = []

for l in xy:
    for i in idx:
        for j in range(1):
            x_temp = xy[idx[i][j]]
            x1 = x_temp[0][0]
            y1 = x_temp[0][1]
            x1_max = x1 + 60
            x1_min = x1 - 60
            y1_max = y1 +60
            y1_min = y1 - 60
            range_grp_1 = [x1_max,x1_min,y1_min,y1_max]
            grp1 = [x1,y1]
            grp_1 = np.array(grp1)
            #print(grp_1,range_grp_1)
            if group_count != 0:
                print('group count greater than 0')
                if np.where((l[i]>x1_min) and (l[i]<x1_max) and (l[i]>y1_min) and (l[i]<y1_max)):
                    print(l[i])

            else:
                group1.append(grp_1)
                group_count+=1

Ошибка:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Ответы [ 2 ]

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

ты собираешься исправить. Предположим, у нас есть 1-й элемент массива: [116 1517]

x_min = 116-60  (56)
x_max = 116+60  (176)
y_min = 1517-60 (1457)
y_max = 1517+60 (1577)

, теперь другие координаты сравниваются с этими значениями: например: теперь у нас есть массив = [146 1568], затем

x =146 y=1568
if x>x_min and x<x_max and y<y_max and y>y_max
       grp.append(array)
else:
       print('not in range)

поэтому я хочу этот тип вывода

146>56 and 146<176 and 1568>1457 and 1568<1577

это может быть правдой, поэтому он будет добавлен в новый массив

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

Я выкладываю новый код здесь.

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

# function to return max and min of list of coordinates
def  min_max(coords):   

   xy = np.array(coords)

   xs = [] #save 'x' values
   for i in range(len(xy)):
        x = [xy[i][0]]
        xs.append(x)   

   ys = [] #save 'y' values
   for i in range(len(xy)):
        y = [xy[i][1]]
        ys.append(y)

   rangex    = []
   rangey    = []

   for x in min(xs): #get min 'x'
       minx = x - 60
       rangex.append(minx)
       maxx = x + 60
       rangex.append(maxx)

   for y in min(ys):  #get min 'y'
        miny = y - 60
        rangey.append(miny)
        maxy = y + 60      
        rangey.append(maxy)

   return [rangex,rangey]

Если вы передадите те же координаты, которые вы опубликовали в первый раз, он вернет

    Execution #1:
    coords = [[116,2306],[118,2307],[126,1517]]
    my_ranges = min_max(coords)
    print(my_ranges)
    #[[56, 176], [1457, 1577]]

Или если выпередать только новый диапазон, который вы мне дали:

   Execution #2:
   new_coord = [[518,2007]]#pay attention to the format
   my_ranges = min_max(new_coord)
   print(my_ranges)
   #[[458, 578], [1947, 2067]]

И последняя часть кода. Тот, который разделяет группы, если они принадлежат оцененному диапазону или нет.

   #changed again:
   group1 = [] #coords in the interval
   group2 = [] #coords out of the interval

   for l in dynCoords:
        pair = [l[0],l[1]]  
        if l[0] in range(my_ranges[0][0],my_ranges[0][1]) and l[1] in range(my_ranges[1][0],my_ranges[1][1]):
                 group1.append(pair)
        else:
                 group2.append(pair)

   #new line appended
   my_ranges = min_max(group2) 

С исходными координатами [[116,2306], [118,2307], [126,1517]] группы [118,2307], [126,1517] вышли из диапазонаи пошел в группу2. С добавленной новой строкой они снова использовались для изменения минимального порога, теперь он меняется с 56-2246 для xs и 176-2366 для ys. Допустим, вы используете group2 в dynCoords, dynCoords = group2 и снова выполняете то, что идет под меткой #changed, вы получаете для group1: [[116, 2306], [118, 2307]] и group2 становится пустым.

Я думаю, что вы можете сделать функцию для этой части кода тоже. И запустите его столько раз, сколько вам нужно, чтобы обработать все установленные вами координаты.

...