从(x,y)坐标numpy数组中提取第一个元素

时间:2019-10-14 11:02:51

标签: python-3.x list numpy

我们正在尝试创建一组相互之间距离很近的坐标。要创建该组,我们需要将numpy数组的x,y坐标与arrary中的第一个元素进行比较。

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

我们已经尝试过使用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 )/数组,其中第一个co-ordiante作为该组中的第一个元素。

如果不在范围内,我们将创建另一个组(例如G2)/阵列,并将不在此范围内的共畸变插入该新组中。

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

希望,我说得更清楚。

非常感谢您的帮助!

最好的问候,

3 个答案:

答案 0 :(得分:0)

尝试,它有效,

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

因为numpy数组坐标1的形状为(9,2),所以不需要坐标[0]来访问x坐标。

答案 1 :(得分:0)

由于您正在寻找一个圆内的点,因此您可以在此处找到一种方法。您将需要对其进行调整,以使其不太清楚。

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半径内创建点的簇,则可以创建一个列出cluster并每次添加附近点列表。

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)](已复制)。

enter image description here

答案 2 :(得分:-1)

我对您的意思没有很好的理解,但是请尝试以下操作:

        return response()->json([
            'message' => 'Quote Successfully Sent!','data' =>  $clientquote
        ], 201);