Минимальное Евклидово расстояние между точками в двух различных массивах Numpy, не в

При навигации между двумя отдельными каталогами и копировании файлов назад и вперед, я делаю это:

cd /some/where/long
src=`pwd`
cd /other/where/long
dest=`pwd`

cp $src/foo $dest

command completion will work by expanding the variable, so you can use tab completion to specify a file you're working with.
39
задан divenex 7 September 2017 в 12:40
поделиться

3 ответа

(несколько месяцев спустя) scipy.spatial.distance.cdist (X, Y) дает все пары расстояний, для X и Y 2 тусклых, 3 тусклых ...
Он также выполняет 22 различных нормы, подробно здесь .

# cdist example: (nx,dim) (ny,dim) -> (nx,ny)

from __future__ import division
import sys
import numpy as np
from scipy.spatial.distance import cdist

#...............................................................................
dim = 10
nx = 1000
ny = 100
metric = "euclidean"
seed = 1

    # change these params in sh or ipython: run this.py dim=3 ...
for arg in sys.argv[1:]:
    exec( arg )
np.random.seed(seed)
np.set_printoptions( 2, threshold=100, edgeitems=10, suppress=True )

title = "%s  dim %d  nx %d  ny %d  metric %s" % (
        __file__, dim, nx, ny, metric )
print "\n", title

#...............................................................................
X = np.random.uniform( 0, 1, size=(nx,dim) )
Y = np.random.uniform( 0, 1, size=(ny,dim) )
dist = cdist( X, Y, metric=metric )  # -> (nx, ny) distances
#...............................................................................

print "scipy.spatial.distance.cdist: X %s Y %s -> %s" % (
        X.shape, Y.shape, dist.shape )
print "dist average %.3g +- %.2g" % (dist.mean(), dist.std())
print "check: dist[0,3] %.3g == cdist( [X[0]], [Y[3]] ) %.3g" % (
        dist[0,3], cdist( [X[0]], [Y[3]] ))


# (trivia: how do pairwise distances between uniform-random points in the unit cube
# depend on the metric ? With the right scaling, not much at all:
# L1 / dim      ~ .33 +- .2/sqrt dim
# L2 / sqrt dim ~ .4 +- .2/sqrt dim
# Lmax / 2      ~ .4 +- .2/sqrt dim
41
ответ дан 27 November 2019 в 02:27
поделиться

Чтобы вычислить матрицу расстояний m на p, это должно работать:

>>> def distances(xy1, xy2):
...   d0 = numpy.subtract.outer(xy1[:,0], xy2[:,0])
...   d1 = numpy.subtract.outer(xy1[:,1], xy2[:,1])
...   return numpy.hypot(d0, d1)

вызовы .outer создают две такие матрицы (скалярных разностей по двум осям) , вызовы .hypot превращают их в матрицу той же формы (скалярных эвклидовых расстояний).

25
ответ дан 27 November 2019 в 02:27
поделиться

Для того, что вы пытаетесь сделать:

dists = numpy.sqrt((xy1[:, 0, numpy.newaxis] - xy2[:, 0])**2 + (xy1[:, 1, numpy.newaxis - xy2[:, 1])**2)
mindist = numpy.min(dists, axis=1)
minid = numpy.argmin(dists, axis=1)

Изменить : вместо вызова sqrt , построения квадратов и т. Д. Вы можете использовать numpy.hypot :

dists = numpy.hypot(xy1[:, 0, numpy.newaxis]-xy2[:, 0], xy1[:, 1, numpy.newaxis]-xy2[:, 1])
5
ответ дан 27 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: