0

こんにちは、行のすべてのペア間の距離を含む行列を返すコードを (python 2 を使用して) 記述しようとしています。以下は私が書いた実装です。期待どおりに動作しますが、行数が大きくなると非常に遅くなる可能性があります。したがって、多数の行に対してコードをより効率的にする方法について誰か提案があるかどうか疑問に思っていました。

前もって感謝します

def gendist(x,alpha=2):
    (n,p) = x.shape
    len = 0
    for ii in range(1,n):
        len = len + ii
    d = np.empty((len,p))
    ind = 0
    for ii in range(0,n):
        for jj in range(1,n):
            if ii < jj:
                d[ind,] = (x[ii,]-x[jj,])**alpha
                ind = ind + 1
    return d
4

3 に答える 3

0

scipy がないと (たとえば、Abaqus をインストールすると、scipy がなくても numpy を取得できます)、少し難しくなります。

def gendist(x,alpha=2):
    xCopies=x.repeat(x.shape[0],axis=0).reshape(np.conatenate(([a.shape[0]],a.shape))
    #n x n x p matrix filled with copies of x
    xVecs=xCopies-xCopies.swapaxes(0,1) #matrix of distance vectors
    xDists=np.sum(xVecs**alpha,axis=-1)**(1/alpha) #n x n matrix of distances
    Return xDists

それは堅牢でなければなりません、少なくともそれは私が使用しなければならなかったものです。

于 2016-09-22T09:03:57.640 に答える
0

を使用X.shapeしているようですが、私にとっては、使用していると想定することがわかりますNumPy

コード:

#!/usr/bin/env python3
import numpy as np
import scipy.spatial.distance as dist

a = np.random.randint(0, 10, (5, 3))
b = dist.pdist(a)
print('Matrix:')
print(a)
print('Pdist')
for d in b:
    print(d)

出力:

Matrix:
[[4 7 6]
 [8 2 8]
 [8 3 5]
 [2 4 7]
 [0 7 5]]
Pdist
6.7082039325
5.74456264654
3.74165738677
4.12310562562
3.16227766017
6.40312423743
9.89949493661
6.40312423743
8.94427191
4.12310562562

ここで、組み合わせの順序は (0,1)、(0,2)、(0,3)、(0,4)、(1,2)、(1,3)、(1,4)、(2 ,3), (2,4), ...

デフォルトのメトリックはユークリッド距離です。pdist他のメトリックを適用するには、を参照してください。

于 2016-09-22T08:29:48.980 に答える