나는 몇 주 동안 연구 코드를 작업 해 왔으며 매트릭스의 모든 지점 사이의 거리를 계산하기 위해 다중 레벨 for 루프가 아닌 cdist를 사용하여 속도를 높이려고 노력해 왔습니다.
내가 원하는 것 :
from scipy.spatial.distance import cdist
import numpy as np
a=np.array([[1],[2],[3]])
cdist(a,a, lambda u,v: u-v)
[[ 0. -1. -2.]
[ 1. 0. -1.]
[ 2. 1. 0.]]
그러나 내 문제는 내 연구의 맥락에서 a가 꽤 크고 cdist에서 사용자 지정 람다 함수를 사용하는 것이 cdist (a, a)보다 상당히 느리지 만 (~ 2 배 정도) 양의 값만 제공한다는 것입니다. 즉, 실제로는 a에 1,000 개의 요소가있는이 15,000 번을 계산해야하므로이 2oom은 매우 중요합니다.
cdist (a, a)는 모두 양수 값이므로 원하는 출력을 제공하지 않습니다.
[[0. 1. 2.]
[1. 0. 1.]
[2. 1. 0.]]
cdist에서 원하는 서명 된 출력을 생성하는 방법에 대한 제안이 있지만 람다 함수를 사용하는 것보다 더 빨리 할 수 있기를 바랍니다.
감사합니다!
거리 측정 항목과 보유한 데이터의 종류에 따라 다음과 같은 다양한 옵션이 있습니다.
특정 경우에 데이터가 1D
있고 |u-v| == ( (u-v)^2 )^(1/2)
거리 행렬의 위쪽 및 아래쪽 삼각형이 절대적으로 동일하고 부호에 대해서만 다르다는 지식을 사용할 수 있으므로 사용자 지정 거리 함수를 피할 수 있습니다.
d = cdist(a, a)
triu_bool = np.triu(np.ones((n_samples, n_samples), dtype=bool))
triu_bool[range(n_samples), range(n_samples)] = False
d[triu_bool] *= -1
# [[ 0. -1. -2.]
# [ 1. 0. -1.]
# [ 2. 1. 0.]]
더 일반적이고 내 눈에 더 나은 접근 방식은 단순히 numpys
방송을 사용하는 것입니다 ( 이 질문 / 답변 참조 ). 여기에 대한 예가 있습니다 u-v
.
# Generate data
n_dim = 3
n_samples = int(1.5e4)
arr = np.concatenate([np.arange(n_samples)[:, np.newaxis]] * n_dim, axis=-1)
# array([[ 0, 0, 0],
# [ 1, 1, 1],
# [ 2, 2, 2],
# ...,
# [14997, 14997, 14997],
# [14998, 14998, 14998],
# [14999, 14999, 14999]])
# u - v
d = arr[:, np.newaxis, :] - arr[np.newaxis, :, :]
# (n_samples, n_samples, n_dim)
대칭 거리 측정의 경우 계산의 절반이 필요하지 않습니다. 그러나 내 경험상 계산을 위쪽 삼각형이나 비슷한 것에 만 적용하는 것보다 더 빠릅니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다