좌표가 NumPy 배열입니다. 예를 들어, 이것을 사용합니다.NumPy 좌표 배열 사이의 삼각형 행렬을 계산하십시오.
In [1]: np.random.seed(123)
In [2]: coor = np.random.randint(10, size=12).reshape(-1,3)
In [3]: coor
Out[3]: array([[2, 2, 6],
[1, 3, 9],
[6, 1, 0],
[1, 9, 0]])
모든 좌표 사이의 삼각 행렬을 원합니다. 간단한 방법은 I는
In [8]: dist = np.sqrt(((coor[:, None, :] - coor) ** 2).sum(-1))
를 사용하여 반복 피할 수있는, 모든 결과
In [7]: dist
Out[7]: array([[ 0. , 3.31662479, 7.28010989, 9.2736185 ],
[ 0. , 0. , 10.48808848, 10.81665383],
[ 0. , 0. , 0. , 9.43398113],
[ 0. , 0. , 0. , 0. ]])
가 NumPy와 활용 거리의 상 삼각 행렬 인 상태
In [4]: n_coor = len(coor)
In [5]: dist = np.zeros((n_coor, n_coor))
In [6]: for j in xrange(n_coor):
for k in xrange(j+1, n_coor):
dist[j, k] = np.sqrt(np.sum((coor[j] - coor[k]) ** 2))
좌표 위에 이중 루프를 코딩하는 것
하지만 결과는 전체 행렬
In [9]: dist
Out[9]: array([[ 0. , 3.31662479, 7.28010989, 9.2736185 ],
[ 3.31662479, 0. , 10.48808848, 10.81665383],
[ 7.28010989, 10.48808848, 0. , 9.43398113],
[ 9.2736185 , 10.81665383, 9.43398113, 0. ]])
이 한 행 버전은 2048 좌표 (10 초 대신 4 초)를 사용하는 경우 대략 절반의 시간이 걸리지 만 대칭 행렬을 얻는 데 필요한 두 배의 계산을 수행합니다. 삼각형 행렬 만 얻을 수 있도록 한 줄 명령을 조정할 수있는 방법이 있습니까 (추가 2 배 속도 향상, 즉 2 초)?
필요한 모든하지 매트릭스 거리, 경우 [SciPy의'pdist' (http://docs.scipy.org/doc/scipy/reference/ generated/scipy.spatial.distance.pdist.html)는 @Divaker에 의해 소개 된 것과 똑같이 반환합니다 ('trip_indices' 또는 boolean-indexing을 사용할 필요가 없습니다). –