python - 我正在使用随机生成的有序对的 numpy 数组,我需要确定有序对是否是不同类型的三角形

标签 python arrays numpy coordinate pythagorean

我这周才开始使用 numpy,并且对此感到非常困惑。看起来与普通的 python 函数有很大不同。

对于形状为 1000X6 的数组,有没有办法在数组中逐行检查,例如等边三角形。我有 6 列,以便每行中有三元组,每个点有 2 个整数。

import numpy as np
pnts = np.random.randint(0,50,(1000, 6))

我还认为创建 3 个如下所示的数组可能会更好:

import numpy as np
A = np.random.random((10,2))
B = np.random.random((10,2))
C = np.random.random((10,2))

创建有序对,然后使用算法找到三角形。

有没有更好的方法来创建一个表示 1000 个有序对的三元组的数组,以及如何在该数组中找到三角形,例如等边三角形。

我现在做了一些改变。我为 x 坐标和 y 坐标创建了两个数组。

x = np.random.randint(0,10,(3,1000))
y = np.random.randint(0,10,(3,1000))

############ 添加到问题############

我的算法采用每个匹配的 x 和 y 坐标来查找每个三角形的边长和角度。我会发布,但代码太多了。现在我还拥有使用角度和边长来查找等角线、等边线、直等腰线和非直等腰线的函数。

我的问题现在更多地与索引相关。我将再次使用等边三角形作为示例,因为这就是我们一直在研究的。

E = np.column_stack((ACXY,ABXY,CBXY))
ES = np.logical_and(E[:,0] == E[:,1], E[:,1] == E[:,2])

我用这个来找到等边三角形。

- ACXY = the distance from point A to C
- ABXY = the distance from point A to B
- CBXY = the distance from point C to B

我希望能够获取所有等边三角形的坐标三元组,对它们进行索引并将它们放入名为 E_Tri 的新数组中。我认为我不需要创建 bool 值的函数。我认为 If: else: 语句也许是更好的方法。

这也可能有帮助,我将显示E = np.column_stack((ACXY,ABXY,CBXY)) 帮助理解 (E) 的数组。

[[  4.           4.47213595   7.21110255]
 [  3.60555128   2.23606798   5.83095189]
 [  2.23606798   9.05538514   8.54400375]
 ..., 
 [  3.60555128   9.05538514   6.08276253]
 [  8.94427191   8.54400375   1.        ]
 [ 10.63014581   1.          10.        ]]

E 看起来就像那样。希望这有意义,如果没有,请告诉我。

也许是这样的,尽管这仅仅添加到问题中是行不通的。

E = np.column_stack((ACXY,ABXY,CBXY))
equilateral = [] 
def E_Tri(E):
    if E[:,0] == E[:,1] and E[:,1] == E[:,2]:
        equilateral.append(E_Tri)
    else:
        return E

最佳答案

您已经很好地描述了如何存储数据,但没有描述算法是什么。例如,如果我们想回答“这组三个 (x,y) 点 P1..P3 是等边三角形吗?”这个问题,我们可以这样表述:

dist(P1,P2) == dist(P2,P3) == dist(P3,P1)

其中 dist(P1,P2) 使用毕达哥拉斯定理:

sqrt((P1.x - P2.x)**2 + (P1.y - P2.y)**2)

但请注意,sqrt() 是不必要的,因为我们关心的是所有三个腿的长度是否相等(如果是,它们的平方也将相等)。

在 NumPy 中,我们希望以可并行的方式完成所有事情。因此,如果您有一个代表 1000 个三角形的 1000x6 数组,则需要一次对 1000 个元素执行所有操作。如果数组名为 A,其列为:

P1.x, P1.y, P2.x, P2.y, P3.x, P3.y

那么第一个操作是:

A[0] - A[2] # P1.x - P2.x
A[1] - A[3] # P1.y - P2.y
A[2] - A[4]
A[3] - A[5]
A[4] - A[0]
A[5] - A[1]

可以写得更简洁:

R = A - np.roll(A, -2, axis=0) # 1000x6 array of all differences

完成后,您可以一次对所有这些 1000x6 结果进行平方,从而为我们提供一个 1000x6 数组 R,我们可以从中添加 x 和 y 对以获得距离平方:

R[0] + R[1] # (P1.x - P2.x)**2 + (P1.y - P2.y)**2
R[2] + R[3]
R[4] + R[5]

这就是说:

S = R[0::2] + R[1::2] # three column-wise additions at once

这为我们提供了 1000x3 距离平方数组 S。现在我们只需检查每一行的列是否都相等:

np.logical_and(S[0] == S[1], S[1] == S[2])

这为我们提供了 1000x1 bool 向量,它告诉我们每行是否是等边三角形。

请注意,我们从未以迭代方式逐行进行。这是因为在 NumPy 中这样做比按列操作慢得多。

请注意,当我说 1000x6 时,我编写了上面的内容,假设数组的形状实际上是 (6,1000)。这是为了方便表示法(A[0] 而不是 A[:,0]),也是因为自 NumPy 以来我们对列进行操作时效率更高默认使用行主序。如果需要,您可以np.transpose()输入数据。

所以最终只是:

A = pnts.T
R = np.square(A - np.roll(A, -2, axis=0))
S = R[0::2] + R[1::2] # 1000x3 squares of distances
np.logical_and(S[0] == S[1], S[1] == S[2]) # 1000 True/False results

关于python - 我正在使用随机生成的有序对的 numpy 数组,我需要确定有序对是否是不同类型的三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783162/

相关文章:

python - 如何查找列表A中也在列表B中的项目的索引

arrays - 以向量化方式将两个维度为 5 的数组相乘

java - 如何在 Java 中填充数组?

python - 为 numpy 数组的行中的每个点找到最近的 k 个点

python - 优雅的列表推导式,可根据另一维的值提取数组一维的值

python - 使用 PIL 在正方形内绘制线条

python - 类型错误 : <Response 36 bytes [200 OK]> is not JSON serializable

arrays - 加快我的字符串文本替换代码

python 将一列的值与条件相加

python - 分隔 numpy 数组中的数字,这些数字用单引号括起来,并用空格分隔