我正在拼命寻找一种高效的方法来检查两个2D numpy数组是否相交。
所以我有两个数组,每个数组都有任意数量的2D数组,例如:
我只需要一个True,如果至少有一个向量与另一个数组中的另一个向量相交,否则为false。因此,它应该给出以下结果:
我有点新手,开始用Python列表编写程序,虽然可以运行,但效率非常低。程序需要几天才能完成,因此我现在正在研究使用
以下是我的程序和Python列表解决方案的一些背景:
我正在进行类似于三维自避随机行走http://en.wikipedia.org/wiki/Self-avoiding_walk的操作。但是,我不是进行随机行走并希望它达到所需长度(例如,我想建立由1000个珠子组成的链),而是进行以下操作:
我创建一个“平坦”的链,长度为N:
现在我将把这个扁平的链折叠起来:
函数PivotFold(chain)将在最初的平面链X上使用大量次数。它写得很朴素,也许您有一些技巧来改进它^^我认为numpy数组会很好,因为我可以有效地转移和旋转整个链而不必循环遍历所有元素...
所以我有两个数组,每个数组都有任意数量的2D数组,例如:
A=np.array([[2,3,4],[5,6,7],[8,9,10]])
B=np.array([[5,6,7],[1,3,4]])
C=np.array([[1,2,3],[6,6,7],[10,8,9]])
我只需要一个True,如果至少有一个向量与另一个数组中的另一个向量相交,否则为false。因此,它应该给出以下结果:
f(A,B) -> True
f(A,C) -> False
我有点新手,开始用Python列表编写程序,虽然可以运行,但效率非常低。程序需要几天才能完成,因此我现在正在研究使用
numpy.array
解决方案,但这些数组真的不太容易处理。以下是我的程序和Python列表解决方案的一些背景:
我正在进行类似于三维自避随机行走http://en.wikipedia.org/wiki/Self-avoiding_walk的操作。但是,我不是进行随机行走并希望它达到所需长度(例如,我想建立由1000个珠子组成的链),而是进行以下操作:
我创建一个“平坦”的链,长度为N:
X=[]
for i in range(0,N+1):
X.append((i,0,0))
现在我将把这个扁平的链折叠起来:
- 随机选择一个元素(“枢轴元素”)
- 随机选择一个方向(要么全部元素朝左,要么朝右)
- 随机选择9种可能的空间旋转之一(3个轴* 3种可能的旋转90°、180°、270°)
- 旋转所选方向的所有元素到所选的旋转角度
- 检查所选方向的新元素是否与其他方向相交
- 无交点->接受新配置,否则->保持原有链。
def PivotFold(chain):
randPiv=random.randint(1,N) #Chooses a random pivotelement, N is the Chainlength
Pivot=chain[randPiv] #get that pivotelement
C=[] #C is going to be a shifted copy of the chain
intersect=False
for j in range (0,N+1): # Here i shift the hole chain to get the pivotelement to the origin, so i can use simple rotations around the origin
C.append((chain[j][0]-Pivot[0],chain[j][1]-Pivot[1],chain[j][2]-Pivot[2]))
rotRand=random.randint(1,18) # rotRand is used to choose a direction and a Rotation (2 possible direction * 9 rotations = 18 possibilitys)
#Rotations around Z-Axis
if rotRand==1:
for j in range (randPiv,N+1):
C[j]=(-C[j][1],C[j][0],C[j][2])
if C[0:randPiv].__contains__(C[j])==True:
intersect=True
break
elif rotRand==2:
for j in range (randPiv,N+1):
C[j]=(C[j][1],-C[j][0],C[j][2])
if C[0:randPiv].__contains__(C[j])==True:
intersect=True
break
...etc
if intersect==False: # return C if there was no intersection in C
Shizz=C
else:
Shizz=chain
return Shizz
函数PivotFold(chain)将在最初的平面链X上使用大量次数。它写得很朴素,也许您有一些技巧来改进它^^我认为numpy数组会很好,因为我可以有效地转移和旋转整个链而不必循环遍历所有元素...
not set1.isdisjoint(set2)
。解决所有对交集问题,并找到N个数组之间的所有交集,时间大约与N个单独交集相当,而不是N^2,只要交集不太多。你能展示基于列表的解决方案吗? - user2357112