【问题标题】:Extract first element from (x,y) co-ordinate numpy array从(x,y)坐标numpy数组中提取第一个元素
【发布时间】:2019-10-14 11:02:51
【问题描述】:

我们正在尝试创建一组彼此靠近的坐标。要创建这个组,我们需要将 numpy 数组的 x、y 坐标与数组中的第一个元素进行比较。

如果它们匹配,我们将其存储在现有数组中的一个中,否则我们创建一个新数组并将它们存储在那里。

我们已经尝试使用 for 循环并分别提取 x 和 y。但是,它没有工作。


mport numpy as np 

coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
              (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
              (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
              (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
              (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
              (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
              (994.0796,1591.2533),(539.5005,1862.1327)] 

seen = set() 

newlist = [] 

for item in coordinates: 
    t = tuple(item) 
    if t not in seen: 
        newlist.append(item) 
        seen.add(t) 

npArray = np.array(newlist) 
newlist = npArray.astype(int) 
npArray2 = np.array(newlist) 
coordinates1 = npArray2.astype(int) 

for i in coordinates1[0]: 
    print(i[0])

我们正在尝试在单独的变量中获取上述消息中坐标的第一个元素。

目前我们收到一个错误: IndexError: 标量变量的索引无效。

我们是 python 新手,所以任何指南都会有所帮助,即使指向更好的方法。

谢谢!


感谢您的所有回答。我认为我的错误在于没有解释问题。我会在这里再试一次:

coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
              (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
              (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
              (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
              (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
              (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
              (994.0796,1591.2533),(539.5005,1862.1327)] 

我们正在尝试创建位于上述列表中第一个坐标的 30 点 + 或 - 的邻近/范围内的坐标组。

因此,为此我们需要将所有坐标 (x, y) 与第一个坐标一一进行比较,如果它们在上述范围内,我们会将它们分配给一个组(例如 G1 )/数组,其中第一个坐标作为该组中的第一个元素。

如果不在范围内,我们将创建另一个组(例如 G2)/数组,并在这个新组中插入不在范围内的坐标。

通过这种方式,我们进一步逐一比较上面列表中的每个元素,直到所有坐标都被比较并分配给其中一个组。

希望,我说得更清楚了。

非常感谢您的帮助!

最好的问候,

【问题讨论】:

  • 因此您想将每个 (x, y) 坐标与坐标列表的第一个值进行比较:(580.4625,201.87183)。如果 (x, y) 接近该值,则将其放置在例如L1 如果不是,则将其放置在例如L2。我对么?你如何定义 (x, y) 是否接近(580.4625,201.87183)?在z的半径范围内?
  • 对了,第一个for循环可以换成set(coordinates)。但是,在我们得到您想要实现的目标之前,我们无法引导您朝着正确的方向前进。也许您可以提供预期的输入/输出。
  • 是的,你是对的。我们在给定坐标的 30 半径内定义接近度,这不是一个列表,我只是将列表转换为 Numpy 数组以获取整数值。 @ma
  • 输出如下:比较数组 [580 201] 与彼此的坐标,并尝试找到 x 的坐标在 550 到 610 的范围内,y 的坐标在 171 到 231 的范围内(如果它们在),那么我们创建一组坐标,否则我们创建一个新数组,然后递归地检查它。搜索后的数组 --> [580 201,[560 214],[552 230]] .

标签: python-3.x list numpy


【解决方案1】:

试一试,效果很好,

    for i in coordinates1: 
        print(i[0])

由于numpy数组coordinate1的形状是(9,2),所以不需要坐标[0]来访问x坐标。

【讨论】:

    【解决方案2】:

    由于您正在寻找圆内的点,因此您可以在此处找到一种方法。您需要根据自己不太明确的需求对其进行调整。

    import numpy as np
    
    coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
                  (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
                  (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
                  (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
                  (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
                  (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
                  (994.0796,1591.2533),(539.5005,1862.1327)]
    
    reference = (580.4625,201.87183)
    z = 30 # Radius
    
    L1 = list()
    L2 = list()
    
    for coord in coordinates:
        # coord is a tuple of 2 values, x and y.
        x = coord[0]
        y = coord[1]
    
        # Compute distance in 2D space
        d = np.sqrt((x-reference[0])**2+(y-reference[1])**2)
    
        # Add to the correct list
        if d <= z:
            L1.append(coord)
        else:
            L2.append(coord)
    

    此外,这些步骤可以通过列表理解来完成,这为您提供了单线:

    L1 = [coord for coord in coordinates if np.sqrt((coord[0]-reference[0])**2+(coord[1]-reference[1])**2) <= z]
    L2 = [coord for coord in coordinates if not np.sqrt((coord[0]-reference[0])**2+(coord[1]-reference[1])**2) <= z]
    

    现在,假设您要在坐标上循环,并且每次创建 L1 附近点列表,即在所考虑坐标的 z = 30 半径内创建点簇,您可以创建一个列表 @ 987654326@并每次添加附近点列表。

    import numpy as np
    
    coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
                  (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
                  (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
                  (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
                  (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
                  (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
                  (994.0796,1591.2533),(539.5005,1862.1327)]
    
    z = 30 # Radius
    clusters = list()
    
    for ref in coordinates:
        # coord is a tuple of 2 values, x and y.
        x = ref[0]
        y = ref[1]
    
        clusters.append([coord for coord in coordinates \
              if np.sqrt((coord[0]-x)**2+(coord[1]-y)**2) <= z])
    

    使用这种方法,如果一个点在 2 个簇的范围内,它将被包含在两个簇中。

    另外,有些点在坐标中出现两次。要删除重复项,您可以使用set

    coordinates = list(set(coordinates))
    

    集群示例。元素(167.84459,701.64935) 指向集群[(167.84459, 701.64935), (167.84459, 694.65247)](已复制)。

    【讨论】:

    • 不,这对我没有用,因为我只是将列表转换为 numpy 数组,我必须比较坐标是否位于特定范围内,然后我们将它们附加到数组中。例如,我们有坐标数组([580 180],[512 323] 等等。之后我们取 [580 180] 以便我们创建 30 个组,它将找到 x_min、x_max、y_min、y_max 的范围,如果其他坐标位于该范围内,我们将这些数组附加到主数组中,如果不是,则创建新数组。我们不想找到任何圆半径。
    • @trivedi 您在此处的评论以及您在主帖中的评论对于理解您的问题并没有多大帮助。在主帖上,你说这就是你所需要的(见编辑);在这个你说它没用。但是,这与我只是稍微修改一下以在坐标上循环的方法相同。
    • 您可以发送您的电子邮件ID吗?
    • @trivedi 显然没有。发表一篇文章,清楚地说明问题,用最小的例子来重现(我坚持重现,不需要实际数据)你的问题,解释你试图做什么,输入代表什么,以及预期什么输出是。
    • @trivedi 我刚刚注意到这句话“array[580 201] [...] 坐标位于 x 的 550 到 610 和 171 到 231 的范围内”。与您之前的评论相比,这不是一个半径为 30 的圆,而是一个以 580、201 为中心、边为 60 的正方形。您想要哪个,正方形还是圆形?无论如何,方法都是相似的,只是改变包含条件的问题。
    【解决方案3】:

    我没听懂你的意思,但试试这个:

    import numpy as np 
    
    coordinates = [(580.4625,201.87183),(580.4625,201.87183),(167.84459,701.64935),
                  (167.84459,701.64935),(167.84459,694.65247),(167.84459,694.65247),
                  (979.09344,725.6387),(979.09344,725.6387),(979.09344,725.6387),
                  (979.09344,725.6387),(200.81406,1271.3956),(200.81406,1271.3956),
                  (200.81406,1271.3956),(1005.0694,1266.398),(1005.0694,1266.398),
                  (1005.0694,1266.398),(180.83257,1568.2635),(180.83257,1568.2635),
                  (994.0796,1591.2533),(539.5005,1862.1327)] 
    
    seen = set()
    newlist = [] 
    
    for item in coordinates: 
        t = tuple(item) 
        if t not in seen: 
            newlist.append(item) 
            seen.add(t) 
    
    npArray = np.array(newlist) 
    newlist = npArray.astype(int) 
    
    for i in newlist: 
        print(i)
    

    【讨论】:

    • 能否请您查看评论部分,这将有助于您理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2017-10-30
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多