, . N
, pt A
. , B
pts , .
, einsum
matrix-multiplication
, this post
, pt
A
, , -
for pt in A:
d = np.einsum('ij,ij->i',B,B) + pt.dot(pt) - 2*B.dot(pt)
, , A
np.einsum('ij,ij->i',B,B)
, :
min_idx = np.empty(N, dtype=int)
min_dist = np.empty(N)
Bsqsum = np.einsum('ij,ij->i',B,B)
for i,pt in enumerate(A):
d = Bsqsum + pt.dot(pt) - 2*B.dot(pt)
min_idx[i] = d.argmin()
min_dist[i] = d[min_idx[i]]
min_dist = np.sqrt(min_dist)
-
np.einsum('ij,ij->i',B,B)[:,None] + np.einsum('ij,ij->i',A,A) - 2*B.dot(A.T)
, , A
, 3D
, :
chunk_size= 100
A.shape = (A.shape[0]//chunk_size, chunk_size,-1)
min_idx = np.empty((N//chunk_size, chunk_size), dtype=int)
min_dist = np.empty((N//chunk_size, chunk_size))
Bsqsum = np.einsum('ij,ij->i',B,B)[:,None]
r = np.arange(chunk_size)
for i,chnk in enumerate(A):
d = Bsqsum + np.einsum('ij,ij->i',chnk,chnk) - 2*B.dot(chnk.T)
idx = d.argmin(0)
min_idx[i] = idx
min_dist[i] = d[idx,r]
min_dist = np.sqrt(min_dist)
min_idx.shape = (N,)
min_dist.shape = (N,)
A.shape = (N,-1)