2016-07-27 4 views
-2

ich eine Matrix habenSuche nächsten Nachbarn k

a = np.array([[ 8.6569141 , 8.19847655, 7.83540289, 8.49673563], 
       [ 7.86962825, 9.16869072, 8.60084933, 8.91840291], 
       [ 9.61896688, 9.69620637, 9.1879124 , 9.87479709], 
       [ 9.17427532, 8.98877464, 8.4313078 , 7.81914999]]) 

ich diesen Code sah die Indizes der k nächsten Nachbarn zu erhalten:

k = 1 
index = a.argsort()[:, :k] 

Ausgang:

array([[2], 
     [0], 
     [2], 
     [3]]) 

Könnte jemand bieten eine Erklärung zu diesen Output-Indizes?

Antwort

0

NumPy der argsort gibt die Indizes, die ein Array sortieren würde:

In [864]: a.argsort() 
Out[864]: 
array([[2, 1, 3, 0], 
     [0, 2, 3, 1], 
     [2, 0, 1, 3], 
     [3, 2, 1, 0]], dtype=int64) 

Dieser Ausgang ist es, Ihnen zu sagen, dass die Indizes der Elemente der ersten Reihe von a aufsteigend sortiert sind 2, 1, 3 und 0. Die Indizes der Elemente der zweiten Reihe sind 0, 2, 3 und 1 und so weiter.

Sofern Sie k = 1 definiert, a.argsort()[:, :k] ist einfach die erste Spalte der Matrix oben:

In [865]: a.argsort()[:, :k] 
Out[865]: 
array([[2], 
     [0], 
     [2], 
     [3]], dtype=int64) 

Daher Code gibt eine 4 × 1 Array, so dass das j th Element den Index enthält (dh die Spalte), in dem sich der Minimalwert der Zeile des Arrays a befindet, oder mit anderen Worten der Index des nächsten Nachbarn zu dem Trainingsbeispiel.

+0

Der anonyme Downvoter schlägt wieder – Tonechas

+0

Wenn Sie nur k Nachbarn benötigen, und k << n, dann ist "argpartition" gegenüber "argsort" vorzuziehen. – Itay