2016-04-20 15 views
1

I eine numpy strukturierte Array zu senden, dass meine Daten alle gilt:eine Reihe von Elementen aus einem numpy strukturierten Array Entfernen zu einem linearen kleinsten Quadraten

:

temp = np.array([(0,0,0,0,0),(0,0,0,0,0),(0,0,0,0,0), \ 
        (0,0,0,0,0),(0,0,0,0,0)], 
dtype = [('x_pos','f4'),('y_pos','f4'),('z_pos','f4'), \ 
        ('x_exp','f4'),('y_exp','f4')]) 

dann zusammen wie folgt zusammen gefüllt

if use_event: 
    if len(points) > 0: 
     points = np.vstack((points,temp)) 
    else: 
     points = temp 

Dies funktioniert gut, ich am Ende mit einer Reihe von 5 verschiedenen Punkten (x, y, z, 0,0). Was ich tun möchte, ist, mit jeder Permutation von 4 dieser Punkte eine Anpassung der kleinsten linearen Quadrate durchzuführen, damit ich schließlich den erwarteten Wert für jeden Punkt finden kann.

Nach dem documentation ich vermute ich, die lineare Least-Squares-Funktion verwenden können, indem Sie:

x_array = points['x_pos'] 
y_array = points['y_pos'] 
A = np.vstack([x_array, np.ones(len(x_array))]).T 
m, c = np.linalg.lstsq(A, y)[0] 

Obwohl ich einen Iterator gezwungen sein könnte, irgendwo in dort zu werfen.

Aber das ist für alle fünf Punkte statt vier der fünf. Bevor ich numpy benutzte, benutzte ich eine Deepcopy von großen Python-Wörterbüchern und "pop" -te das Element, das ich nicht wollte, aber das ist langsam und verschlang Tonnen von Speicher, während ich wiederholt wiederholte. Hat jemand einen klaren Vorschlag, wie ich das hier machen kann?

Ein kurzer Clip meiner Daten sieht wie folgt aus:

Punkte:

[[(-76.3629379272461, 13.817119598388672, 15062.244140625, 0.0, 0.0) 
(-77.6500473022461, 11.30630874633789, 14861.1728515625, 0.0, 0.0) 
(-82.07966613769531, 4.440931797027588, 14612.07421875, 0.0, 0.0) 
(-90.221435546875, -4.660646915435791, 14312.16796875, 0.0, 0.0) 
(-101.93490600585938, -19.41192054748535, 13962.134765625, 0.0, 0.0)] 
[(28.65045738220215, -38.633392333984375, 15062.1591796875, 0.0, 0.0) 
(14.097150802612305, -36.76347732543945, 14861.2138671875, 0.0, 0.0) 
(-9.500401496887207, -40.40631866455078, 14612.1259765625, 0.0, 0.0) 
(-35.776180267333984, -44.91004180908203, 14312.1669921875, 0.0, 0.0) 
(-69.49923706054688, -51.34267044067383, 13962.0263671875, 0.0, 0.0)] 
[(25.63878059387207, 47.59636306762695, 15062.5927734375, 0.0, 0.0) 
(27.440467834472656, 43.73832702636719, 14861.8408203125, 0.0, 0.0) 
(25.880281448364258, 32.709007263183594, 14613.0322265625, 0.0, 0.0) 
(21.14924430847168, 22.327594757080078, 14313.4365234375, 0.0, 0.0) 
(17.18960952758789, 10.372784614562988, 13963.8125, 0.0, 0.0)] .... 

und Punkte ['x_pos']:

[[ -76.36293793 -77.6500473 -82.07966614 -90.22143555 -101.93490601] 
[ 28.65045738 14.0971508 -9.5004015 -35.77618027 -69.49923706] 
[ 25.63878059 27.44046783 25.88028145 21.14924431 17.18960953] ... 
+0

Da alle Felder die gleichen 'dtype' haben, sollten Sie in der Lage sein, dies als eine 2D-Array zu sehen, versuchen Sie' temp.view (float, 5) ' . http://stackoverflow.com/questions/36485619/how-do-i-load-heterogeneous-data-np-genfromtxt-as-a-2d-array – hpaulj

+0

Eigentlich war die Antwort wirklich einfach 'delete' ist das, was ich wollte! Das zweite Beispiel aus [Dokumentation] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.delete.html) zeigt, wie eine Spalte gelöscht wird. Das dritte Argument ist die Achse, und anscheinend bedeutet das, dass in einem 2D-Array "1" die Spalte ist. Ich wünsche Art würde ich schon fragen, mehr Forschung getan haben, aber vielleicht wird es jemand anderes helfen ... – Chris

Antwort

1

Nun, ich es herausgefunden. Ich muss den Löschbefehl verwenden. Das dritte Argument von delete gibt die Achse an, die gelöscht werden soll, in einem 2D-Array ist dies die Spalte. So konnte ich tun:

for cut_point in range(5): 
    x_trim = np.delete(x_array,cut_point,1) 
    y_trim = np.delete(y_array,cut_point,1) 

    Do stuff 
    ..... 

ich wünschte wirklich, ich würde vor der Veröffentlichung dieser ein wenig mehr Forschung getan haben, stellt sich heraus, es ist eine ziemlich einfache Lösung war. Vielleicht hat jemand kann, obwohl in der Zukunft davon profitieren ...

Verwandte Themen