2016-04-02 2 views
3

Ich versuche, nur eindeutige Zeilen in numpy.dararray (Variable namens Cluster) zu wählen. Wenn ich diese Variable definieren explizit wie hier:Kann Methode zum Suchen von eindeutigen Zeilen in numpy.darray in Python nicht anwenden

cluster=np.array([[0.157,-0.4778],[0.157,-0.4778],[0.157,-0.4778],[-0.06156924,-0.21786049],[-0.06156924,-0.21786049],[0.02,-0.35]]) 

es funktioniert, wie es sollte:

[[ 0.157  -0.4778 ] 
[-0.06156924 -0.21786049] 
[ 0.02  -0.35  ]] 

Aber leider diese Variable Cluster ist ein Teil eines größeren Array (xtrans). So kann es nur durch Array Slicing definiert werden:

splitted_clusters=[0,1,4,5,10] 

cluster=xtrans[splitted_clusters]

Die Funktionen sind die gleichen, sind die Datentypen gleich.

ABER !!! In letzterem Fall funktioniert es ziemlich komisch: Es kann identische Zeilen hinzufügen oder es kann sie nicht hinzufügen. Als Ergebnis Ich habe so etwas wie dies:

[[ 0.157  -0.4778 ] 
    [ 0.157  -0.4778 ] 
    [-0.06156924 -0.21786049] 
    [ 0.02  -0.35  ]] 

In meinem realen Beispiel mit einem 44 * 2 Array es 22 identische Zeilen addieren und es fehlt 23 von ihnen (das Schema ziemlich seltsam ist auch: es fügt Zeilen mit den Indizes 0, 1, 2, 4, 9, 11, 12, 18 usw. hinzu. Die Anzahl der hinzugefügten identischen Zeilen ist jedoch unterschiedlich. UND es soll nur eine (die erste) Zeile dieser 44 Zeilen hinzufügen.

Wie für Verfahren der Wahl eindeutigen Zeilen zunächst verwendete ich ein aus diesem Thread Find unique rows in numpy.array

b =np.ascontiguousarray(cluster).view(np.dtype((np.void, cluster.dtype.itemsize * cluster.shape[1]))) 
_, idx = np.unique(b, return_index=True) 
unique_cl = cluster[idx] 

Dann habe ich meinen Code versucht, zu überprüfen:

unique_cl=np.array([0,0]) 
for i in range(cluster.shape[0]): 
    if i==0: 
     unique_cl=np.vstack([cluster[i,:]]) 
    elif cluster[i,:].tolist() not in unique_cl.tolist(): 
     unique_cl=np.vstack([unique_cl,cluster[i,:]]) 

Die Ergebnisse sind die gleichen, und ich Ich habe wirklich keine Ahnung warum. Ich wäre sehr dankbar für jede Hilfe/Beratung/Anregung/Idee.

Das Problem war in Schwimmern. Wenn ich Werte von Array auf 7 Dezimalstellen gerundet habe, funktioniert alles wie es sollte. Danke Eelco Hoogendoorn für diese Idee.

+0

Ist "b" gleich? Es sieht so aus, als ob 'b' die gleichen Daten sind, aber jede Zeile wird als 'void' Element mit 16 Bytes angesehen. Dadurch kann 'unique' seine abgeflachte Sortierung und Auswahl vornehmen. – hpaulj

+0

@hpaulj Ich nehme ja an, da es in diesem Code kein anderes 'b' gibt. Es ist vom Typ "numpy.darray", aber wenn ich versuche, es zu drucken, sehe ich seltsame Symbole und ich weiß nicht, wie sie kodieren/decodieren: '[ | гY ? 9 v ? \t h "lx ? @ | гY ? 9 v ? \t h" lx ? | гY ? 9 v ? \t h "lx ? K7 A' ? 9 v ? F x ? | гY ? 9 v ? \t h" lx ? @ | гY ? 9 v ? \t h "lx ? | гY ? 9 v ? \t h" lx ? @ @ @] ' – Nataly

+0

Was ist die Form und der Typ des' b', der von 'xtrans [splitted_clusters] erzeugt wird'? Wir können dein Problem nicht mit einer Probe von 'xtrans' oder einer Idee, wie das transformiert wird, um das neue' b' zu erzeugen, debuggen. – hpaulj

Antwort

2

Sie können dies tun, indem Sie list in set konvertieren.

aList = [[ 0.157, -0.4778], [ 0.157, -0.4778],[-0.06156924, 
-0.21786049], [ 0.02, -0.35]] 
  1. Machen Sie eine Liste von tuples aus der Liste der Listen, sonst werden Sie not be able to create set or dictionary from it.
  2. Set Konstruktor Rest für Sie tun

    set([tuple(a) for a in aList])

Ausgang:

set([(-0.06156924, -0.21786049), (0.02, -0.35), (0.157, -0.4778)]) 
+0

Dann können Sie natürlich zurück in zweidimensionale "Liste" konvertieren –

+0

Vielen Dank für diese Idee, aber ich muss die ursprünglichen Indizes des Arrays speichern. Zum Beispiel im ersten Code in meiner Frage sind die Indizes in Variable 'idx' – Nataly

1

The numpy_indexed Paket (Disclaimer: Ich bin sein Autor) implementiert Funktionalität dieser Art , ähnlich wie die von Ihnen gepostete Lösung. Aber hoffentlich werden sich seine Unit-Tests als nützlich erweisen, und die Dinge funktionieren wie erwartet ... Könnten Sie es an Ihrem Dataset ausprobieren und sehen, ob es das gleiche Problem hat?

import numpy_indexed as npi 
npi.unique(cluster) 
# try this as well, to see if fp representation has something to do with it 
npi.unique(cluster.round(4)) 
0

Eine Lösung eindeutige Zeilen in Ihrem numpy Array zu finden

In [13]: uniq_vals, counts = np.unique(cluster, axis=0, return_counts=True) 

In [14]: uniq_vals 
Out[14]: 
array([[-0.06156924, -0.21786049], 
     [ 0.02  , -0.35  ], 
     [ 0.157  , -0.4778 ]]) 

In [15]: counts 
Out[15]: array([2, 1, 3], dtype=int64) 

Die Option wäre return_counts Sie die Grafen von eindeutigen Zeilen erhalten können.

Diese Lösung wird erklärt in Find unique rows in numpy.array

Verwandte Themen