我更新了问题陈述,以帮助解决识别与特定坐标对距离最短的坐标对列表的问题。我有一个可变长度的2D列表/数组,如下所示 :
d = [[[10,10],[20,20]],[[40,40],[60,60],[20,20]],[[60,60],[20,20],[30,30],[10,10]],[[70,70],[20,20]]]
我想要列表中最接近[80,80]的元素索引列表。
答案应该是:
[1, 1, 0, 0]
最好的pythonic方式是什么? @ tom-fuller和@Skycc提到了一个很好的方法来做到这一点,但是我需要再进一步,看一对值来满足条件。根据推荐的内容,我试过了;
[i.index(min(i, key=lambda x:np.linalg.norm(x-[80,80]))) for i in d]
这不起作用。我怀疑在这里使用iterable我的min函数让我感到悲伤。
答案 0 :(得分:2)
您可以使用lambda
从列表中的所有值中删除8,然后使用min
单个整数
d=[[1,2],[4,6,2],[6,2,3,1],[7,2]]
closest = []
for x in d:
closest.append(x.index(min(x, key = lambda y:abs(y-8))))
print(closest)
答案 1 :(得分:2)
使用列表理解
d = [[1,2],[4,6,2],[6,2,3,1],[7,2]]
close8 = [i.index(min(i, key=lambda x:abs(x-8))) for i in d]
# [1, 1, 0, 0]
答案 2 :(得分:1)
这是一种几乎矢量化的方法 -
def closestID(a, value):
a = np.concatenate(d)
lens = np.array(list(map(len,d)))
r = np.abs(a-value)
ids = np.arange(len(lens)).repeat(lens)
b = np.column_stack((r,ids))
startidx = np.append(0,lens[:-1].cumsum())
out = np.lexsort(b.T)[startidx] - startidx
return out
示例运行 -
In [92]: d
Out[92]: [[8, 1, 2, 7], [4, 6, 2, 8], [6, 2, 3, 8, 1], [7, 2, 10], [5, 7, 2, 6, 4]]
In [93]: closestID(d,8)
Out[93]: array([0, 3, 3, 0, 1])
In [94]: closestID(d,6)
Out[94]: array([3, 1, 0, 0, 3])
答案 3 :(得分:1)
两点之间的距离可以使用pythagarous a2 + b2 = c2
找到。使用此逻辑,您希望找到c2
的最小值,这可以像以前一样完成,代码是一行,我只是将其拆分以便于查看。< / p>
<强>坐标强>
d = [[[10,10],[20,20]],[[40,40],[60,60],[20,20]],[[60,60],[20,20],[30,30],[10,10]],[[70,70],[20,20]]]
point = [80, 80]
closest = []
for List in d:
close = List.index( # position
min(List, # smallest
key = lambda p: # lambda for each coordinate in the list
(point[0] - p[0]) ** 2 + # a2
(point[1] - p[1]) ** 2 # b2
))
closest.append(close) # add it to the list
print(closest)
在您的上下文中:
所以你有一个像这样的列表[image, image, image]
每个图片都包含对象[[object], [object, object], [object, object]]
每个对象都有两个点[[[point, point]], [[point, point], [point, point]]]...
每个点都有一个x和y坐标,例如[10, 10]
您的代码应如下所示:
d = ...
closest = []
for image in d:
point = # MIDPOINT of image
for object in image:
# this is the same as the code above just with List switched for object
close = object.index(min(object, key = lambda p: (point[0] - p[0]) ** 2 + (point[1] - p[1]) ** 2))
closest.append(close)
print(closest)