我本周开始使用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坐标,找到每个三角形的边长和角度。我会发布,但它的代码太多了。而且现在我还有使用角度和边长来找到Scalene,Equilateral,Right Isoceles和Non-right Isoceles的函数。
我的问题现在更多与索引相关。我将再次使用等边三角形作为例子,因为这是我们一直在使用的。
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:语句可能是更好的方法。
这也有帮助,我会显示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
答案 0 :(得分:3)
您已经很好地描述了如何存储数据,但没有描述算法的含义。例如,如果我们想回答“这是三个(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的布尔向量,它告诉我们每行是否是等边三角形。
请注意,我们从未以迭代方式逐行进行。这是因为在NumPy中这样做比在逐列操作中慢得多。
请注意,我已经写了上面的内容,假设当我说(6,1000)
时,数组的形状实际上是1000x6
。这是为了方便表示法(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