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

2024-04-28 09:43:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我这周开始用numpy,我很困惑。似乎与普通的python函数非常不同。在

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

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

我还认为最好创建3个这样的数组:

^{pr2}$

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

有没有更好的方法来创建一个表示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。我不认为我需要创建布尔值的函数。我认为也许If:else:statement可能是更好的方法。在

这也可能有帮助,我将显示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

Tags: the方法函数fromstacknpcolumnrandom
1条回答
网友
1楼 · 发布于 2024-04-28 09:43:05

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

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

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

^{pr2}$

但是请注意,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平方的距离数组。现在我们只需检查每一行的列是否都相等:

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

这给了我们1000x1布尔向量,它告诉我们每一行是否是等边三角形。在

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

请注意,我在编写上述代码时假设数组的形状实际上是(6,1000),而我说1000x6。{{major}在默认情况下,{major}表示法在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

相关问题 更多 >