我这周开始用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
您已经很好地描述了如何存储数据,但没有描述算法是什么。例如,如果我们想回答“这三个(x,y)点P1..P3的集合是一个等边三角形”的问题,我们可以这样表述:
其中
^{pr2}$dist(P1,P2)
使用毕达哥拉斯定理:但是请注意,
sqrt()
是不必要的,因为我们只关心是否所有的三条腿长度相等(如果它们是,它们的平方也将相等)。在在NumPy中,我们希望以一种可并行化的方式完成所有事情。因此,如果有一个代表1000个三角形的1000x6数组,则需要一次对1000个元素执行所有操作。如果数组名为A,其列为:
那么第一个操作是:
可以写得更简洁:
这样,你就可以一次将所有1000x6的结果平方,得到一个1000x6数组R,从中我们将x和y对相加,得到距离的平方:
也就是说:
这给出了1000x3平方的距离数组。现在我们只需检查每一行的列是否都相等:
这给了我们1000x1布尔向量,它告诉我们每一行是否是等边三角形。在
请注意,我们从未以迭代的方式逐行进行。这是因为在NumPy中这样做比执行列操作慢得多。在
请注意,我在编写上述代码时假设数组的形状实际上是np.transpose()输入数据。在
(6,1000)
,而我说1000x6
。{{major}在默认情况下,{major}表示法在所以最后只是:
相关问题 更多 >
编程相关推荐