我想比较一个 2d numpy 数组以发现数据是否位于范围之间,如果是,则应该将其追加到新组中

I want to compare a 2d numpy array to find that data is lies between the range or not if yes than it should be append in new group

我想将 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()

我post这里有一个新代码。

正如你所说的,你有很多点,范围似乎在变化,我建议你将控件包装在一个函数中,这样你就可以根据需要多次调用它,传递坐标范围待评价。

# 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]

如果您传递与第一次 post 相同的坐标,它 returns

    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组。附加新行后,它们再次用于更改最小阈值,现在 xs 为 56-2246,ys 为 176-2366。假设您在 dynCoords 中使用 group2,dynCoords = group2 并再次执行标签#changed 下的内容,您将获得 group1:[[116, 2306], [118, 2307]] 并且 group2 变为空。

我想你也可以为那部分代码创建一个函数。 运行 处理所有坐标集所需的次数不限。

你要改正。 假设我们有数组的第一个元素:[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

这可能是真的,所以它会追加到新数组中