我想比较一个 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
这可能是真的,所以它会追加到新数组中
我想将 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
这可能是真的,所以它会追加到新数组中