选择满足python中

时间:2016-11-28 10:21:35

标签: python arrays list numpy

我更新了问题陈述,以帮助解决识别与特定坐标对距离最短的坐标对列表的问题。我有一个可变长度的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函数让我感到悲伤。

4 个答案:

答案 0 :(得分:2)

您可以使用lambda从列表中的所有值中删除8,然后使用min

获取最接近0的值
  

单个整数

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)