Seite 1 von 1
Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Samstag 26. März 2016, 17:16
von Buedenbe
Hallo alle Zusammen,
Problem:
ich möchte ein Funktion schreiben. Diese Funktion bekommt als Übergabeparameter ein Array das wiederum 2 Dimensional ist. Die erste Dimension stellt das Frame da. Bei der Zweiten handelt es sich um Koordinaten im Raum & geht dementsprechend von 0..2. Nun möchte ich alle Frames aus der Liste löschen wo die y Koordinate <10 oder größer >50 ist. Mein Ansatz bisher sah so aus
Code: Alles auswählen
def detectGround(self, marker):
print("start detect")
#for i in range(0, len(rigidBody)):
for t in range (0, len(marker)):
if (marker[t][2]<10)or((marker[t][2]>50)):
marker.pop(t)
print (marker)
ich bekomme dabei den Fehler: AttributeError: 'numpy.ndarray' object has no attribute 'pop'
Edit:
Hab es auch schon mit
versucht und bekam dafür allerdings folgenden Fehler:
ValueError: cannot delete array elements
Frage:
Gibt es ein äquivalent zu .pop das mir alle koordinaten zum entsprechenden Frame rausschmeißt?
Bin leider aus der Numpy.Array Doc kein stück schlauer geworden
http://docs.scipy.org/doc/numpy-1.10.1/ ... y.ma.array
Und gibt es eine sauberere Art das Problem zu lösen.
LG
Hintergrund:
Es geht eigentlich um MotionCapture. Ich habe eine C3D Datei in der Markerdaten stehen. Mit der BTK Library ist es mir gelungen die C3D Datei zu öffnen und die Koordinaten der Marker die ich benötige zu bekommen.
Ich habe nun die Koordinaten von 3 Markern / Sensoren die sich auf dem rechten Fuß befinden. Meine Aufgabe ist es einen Schritt mittels eines Pythonscripts zu erkennen. Daher benötige ich die y Koordinate (Höhe) des Markers wenn der Fuß sich auf dem Boden befindet.
Re: Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Samstag 26. März 2016, 17:28
von BlackJack
@Buedenbe: Beschäftige Dich mal näher damit wie man Teile eines Array abfragt, zum Beispiel die komplette dritte Spalte, was passiert wenn man ein Array mit einem Skalar vergleicht, und was passiert wenn man ein Array mit Wahrheitswerten als Index in ein Array verwendet. Also am besten mal das Numpy-Tutorial durcharbeiten.
Wenn Du mit einer ``for``-Schleife in Python über ein Numpy-Array iterierst, dann machst Du in 99% der Fälle etwas falsch, denn Numpy benutzt man normalerweise wegen der Operationen die diese Arrays bieten die sich auf alle Elemente beziehen ohne das man selber eine Schleife schreiben muss.
Der Name der ”Methode” ist falsch weil die nichts detektiert sondern etwas entfernt und es ist auch keine Methode sondern anscheinend nur eine Funktion. Also solche sollte sie dann auch nicht in der Klasse stehen.
Re: Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Samstag 26. März 2016, 17:38
von Buedenbe
BlackJack hat geschrieben:@Buedenbe: Beschäftige Dich mal näher damit wie man Teile eines Array abfragt, zum Beispiel die komplette dritte Spalte, was passiert wenn man ein Array mit einem Skalar vergleicht, und was passiert wenn man ein Array mit Wahrheitswerten als Index in ein Array verwendet. Also am besten mal das Numpy-Tutorial durcharbeiten.
Meinst du dieses Tutorial?
https://docs.scipy.org/doc/numpy-dev/us ... start.html hatte ich sowieso gerade mit begonnen.
BlackJack hat geschrieben:
Wenn Du mit einer ``for``-Schleife in Python über ein Numpy-Array iterierst, dann machst Du in 99% der Fälle etwas falsch, denn Numpy benutzt man normalerweise wegen der Operationen die diese Arrays bieten die sich auf alle Elemente beziehen ohne das man selber eine Schleife schreiben muss.
Ok das dachte ich mir schon! Dankeschön wird sich denke lösen wenn ich das tutorial durch habe.
BlackJack hat geschrieben:
Der Name der ”Methode” ist falsch weil die nichts detektiert sondern etwas entfernt und es ist auch keine Methode sondern anscheinend nur eine Funktion. Also solche sollte sie dann auch nicht in der Klasse stehen.
Habe niemals gesagt das es eine Methode ist

und die Funktion ist ja auch noch nicht fertig. Sie soll nachher zählen welche y Koordinate am häufigsten vorkommt um mir die Höhe des Sensor am Fuß zu geben, wenn dieser sich auf dem Boden befindet.
Hab das ganze jetzt vorerst so gelöst:
Code: Alles auswählen
def detectGround(self, marker):
marker=marker.round(0)
#for i in range(0, len(rigidBody)):
for t in range (0, len(marker)):
if (marker[t][2]<10)or((marker[t][2]>50)):
pass
else:
nMarker=marker[t]
print (nMarker)
Aber wie du schon sagtest wirkt das ganze für mich super unsauber. Deswegen arbeite ich mich jetzt erstmal durch das tutorial.
Danke denoch. Beitrag kann geschlossen werden
Re: Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Samstag 26. März 2016, 18:29
von BlackJack
@Buedenbe: Du hast der ”Methode” ein Argument `self` gegeben das nicht verwendet wird, was einerseits sagt es ist in einer Klasse definiert, andererseits aber zeigt, dass es das nicht sollte.
Bezüglich der Namenschreibweisen lohnt sich ein Blick in den
Style Guide for Python Code.
Code nach dem Muster ``for i in range(len(sequence)):`` nur um dann `i` als Index in `sequence` zu verwenden ist in Python ein „anti pattern“, weil das ein unnötiger Umweg über einen Index ist. Man kann in Python direkt über die Elemente von Sequenztypen iterieren.
Wenn man sowohl einen ``if``- als auch ``else``-Zweig hat und in einem der beiden nur ein ``pass`` steht, dann hat man etwas falsch gemacht, denn das kann man immer so umformulieren das man keinen ``pass``-Zweig hat.
Re: Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Samstag 26. März 2016, 20:01
von Buedenbe
BlackJack hat geschrieben:@Buedenbe: Du hast der ”Methode” ein Argument `self` gegeben das nicht verwendet wird, was einerseits sagt es ist in einer Klasse definiert, andererseits aber zeigt, dass es das nicht sollte.
Wie gesagt die Sache ist die, das weder Methode noch Klasse fertig sind. Ich möchte später in der Funktion der Klasse die Attribute self.baseHeight zu weisen.
BlackJack hat geschrieben:
Code nach dem Muster ``for i in range(len(sequence)):`` nur um dann `i` als Index in `sequence` zu verwenden ist in Python ein „anti pattern“, weil das ein unnötiger Umweg über einen Index ist. Man kann in Python direkt über die Elemente von Sequenztypen iterieren.
kannst du mir dazu mal ein Codebsp. geben? Wie würde die Iteration über Elemente von Sequenztypen aussehen?
BlackJack hat geschrieben:
Wenn man sowohl einen ``if``- als auch ``else``-Zweig hat und in einem der beiden nur ein ``pass`` steht, dann hat man etwas falsch gemacht, denn das kann man immer so umformulieren das man keinen ``pass``-Zweig hat.
Das hat mich optisch auch gestört.
Was ich nicht verstehe wie es dazu kommen kann:
Code
Code: Alles auswählen
if (marker[t][2]<10) and (marker[t][2]>50):
print ("true: "+str(marker[t][2]))
else:
print ("false: " + str(marker[t][2]))
Output
false: 32.0
false: 32.0
false: 32.0
false: 32.0
false: 32.0
false: 32.0
false: 32.0
false: 32.0
false: 32.0
Denn die Bedingung (Wert >10 & <50) sollte bei einem Wert von 32 ja erfüllt sein oder nicht?
Re: Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Samstag 26. März 2016, 20:14
von BlackJack
@Buedenbe: Beispiele für ``for``-Schleifen über iterierbare Objekte sollten sich in einem Python-Grundlagentutorial finden. Zum Beispiel in dem in der Python-Dokumentation.
Code: Alles auswählen
In [1]: xs = [1, 2, 3]
In [2]: for i in range(len(xs)):
...: print(xs[i])
...:
1
2
3
In [3]: for item in xs:
...: print(item)
...:
1
2
3
Bei welchem Wert sollte die Bedingung ``(marker[t][2]<10) and (marker[t][2]>50)`` denn erfüllt sein? Welche Zahl ist kleiner 10 und gleichzeitig grösser 50?
Re: Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Samstag 26. März 2016, 20:19
von Buedenbe
all right.

Das habe ich übersehen Danke für das Code Bsp.! Merke schon werde etwas mehr an Grundlage brauchen um weiter zu machen.
Re: Bearbeitung eines Arrays / Analyse Motion Capture
Verfasst: Dienstag 29. März 2016, 18:39
von BlackJack
Vielleicht mal ein Beispiel wie man die Zeilen eines Arrays auswählen kann bei denen der Wert in der zweiten Spalte kleiner als 0.5 ist:
Code: Alles auswählen
In [14]: A
Out[14]:
array([[ 0.76526368, 0.0756187 ],
[ 0.76687865, 0.76861031],
[ 0.62740351, 0.65549339],
[ 0.79193434, 0.56271425],
[ 0.9835214 , 0.83068654],
[ 0.90833132, 0.72905747],
[ 0.10475712, 0.80715086],
[ 0.38129425, 0.38777476],
[ 0.70395613, 0.50487371],
[ 0.86258727, 0.70959996]])
In [15]: A[:,1]
Out[15]:
array([ 0.0756187 , 0.76861031, 0.65549339, 0.56271425, 0.83068654,
0.72905747, 0.80715086, 0.38777476, 0.50487371, 0.70959996])
In [16]: A[:,1] < 0.5
Out[16]: array([ True, False, False, False, False, False, False, True, False, False], dtype=bool)
In [17]: A[A[:,1] < 0.5]
Out[17]:
array([[ 0.76526368, 0.0756187 ],
[ 0.38129425, 0.38777476]])