ndarray Feldnamen für Zeile und Spalte?

7

Ich bin ein Informatiklehrer, der versucht, mit NumPy ein kleines Notenbuch für mich zu erstellen. Aber ich denke, es würde meinen Code einfacher schreiben lassen, wenn ich ein NDarray erstellen könnte, das Feldnamen sowohl für die Zeilen als auch für die Spalten verwendet. Folgendes habe ich bis jetzt:

%Vor%

Also, wenn mein erster Schüler eine 97 auf "assign 1" bekommt, kann ich entweder schreiben:

%Vor%

Außerdem kann ich Folgendes tun:

%Vor%

Das alles funktioniert. Aber was ich nicht herausfinden kann, ist die Verwendung einer Schüler-ID-Nummer, um auf einen bestimmten Schüler zu verweisen (angenommen, dass zwei meiner Schüler Schüler-IDs haben, wie gezeigt):

%Vor%

... oder vielleicht eine zweite Ansicht mit den verschiedenen Feldnamen erstellen?

%Vor%

Ich weiß, dass ich ein Diktat erstellen könnte, das Schüler-IDs auf Indizes abbildet, aber das scheint fragil und grausam, und ich hoffe, es gibt einen besseren Weg als:

%Vor%

Ich bin auch bereit, Dinge neu zu gestalten, wenn es ein saubereres Design gibt. Ich bin neu bei NumPy, und ich habe noch nicht viel Code geschrieben, also ist es kein Problem, von vorne anzufangen, wenn ich Doing It Wrong mache.

Ich bin muss einmal am Tag alle Zuweisungspunkte für über einhundert Studenten zusammenfassen sowie Standardabweichungen und andere Statistiken ausführen. Außerdem werde ich auf die Ergebnisse warten, also möchte ich es in nur ein paar Sekunden laufen lassen.

Vielen Dank im Voraus für Anregungen.

    
Graham Mitchell 11.10.2010, 22:08
quelle

3 Antworten

11

Von Ihrer Beschreibung aus wäre es besser, eine andere Datenstruktur als ein standardmäßiges numpy Array zu verwenden. ndarray s sind dafür nicht gut geeignet ... Sie sind keine Tabellenkalkulation.

Allerdings gab es in jüngster Zeit umfangreiche Arbeiten zu einer Art von num- py-artigem Array, das für diesen Zweck gut geeignet ist. Hier finden Sie eine Beschreibung der letzten Arbeiten zu DataArrays. Es wird eine Weile dauern, bis dies vollständig in numpy integriert ist, obwohl ...

Eines der Projekte, auf die die kommenden numpy DataArrays (Art von) basieren, ist "Larry" (kurz für "Labeled Array "). Dieses Projekt klingt genau nach dem, was Sie tun möchten ... (Sie haben Zeilen und Spalten benannt, aber ansonsten transparent wie ein numpliges Array.) Es sollte stabil genug sein, um es zu benutzen (und von meinem begrenzten Spiel mit ihm) ziemlich glatt!) aber bedenke, dass es wahrscheinlich durch eine eingebaute numpy Klasse ersetzt wird.

Nichtsdestotrotz können Sie die Tatsache gut nutzen, dass die (einfache) Indizierung eines numpy-Arrays eine Ansicht in dieses Array zurückgibt und eine Klasse erstellt, die beide Schnittstellen bereitstellt ...

Alternativ dazu ist @ unutbus Vorschlag oben eine andere (einfachere und direktere) Art der Handhabung, wenn Sie sich dafür entscheiden, Ihre eigenen zu rollen.

    
Joe Kington 12.10.2010, 00:41
quelle
7

Zum Eingeben und Speichern der Daten würde ich eine relationale Datenbank verwenden (wie SQLite, MySQL oder PostgreSQL). Wenn Sie dies auf diese Weise tun, können Sie problemlos mehrere Programme schreiben, die die Daten auf unterschiedliche Weise analysieren. Auf die sqlite-Datenbank selbst kann über eine Vielzahl von Programmiersprachen, GUI / CLI-Schnittstellen, zugegriffen werden. Ihre Daten würden sprachunabhängig bleiben (im Gegensatz zu numpigen Arrays).

Python hat eine integrierte Unterstützung für sqlite .

SQL bietet eine praktische, lesbare Sprache zum Schneiden und Würfeln Ihrer Daten (zB "Was sind alle Punkte für Aufgabe1 aus Klasse1? Geben Sie eine Liste der 10 höchsten Punkte. Wer hatte diese Punkte? Hat Klasse1 einen höheren Durchschnitt als class2?) Die Datenbanktabellen würden mehrere Klassen, mehrere Semester leicht aufnehmen.

Zum Eingeben von Daten kann eine GUI am bequemsten sein. Für sqlite gibt es sqlitebrowser (ich habe hier allerdings nicht viel Erfahrung; es könnte noch bessere Möglichkeiten geben.). Für MySQL mag ich phpmyadmin und für Postgresql phppgadmin.

Sobald Sie die Daten eingegeben haben, können Sie mit einem Python-Modul (z. B. sqlite3, MySQLdb, pyscopg2) auf die Datenbank zugreifen und SQL-Abfragen ausführen. Die Daten können dann in eine Liste oder ein Nummernfeld eingegeben werden. Sie können dann numpy verwenden, um Statistiken zu berechnen.

PS. Bei kleinen Datensätzen gibt es kein Problem hinsichtlich Geschwindigkeit oder Speicherbedarf. Sie müssen die Daten nicht einfach in einem Array speichern, um sie aufzurufen numpy / scipy Statistikfunktionen.

Sie könnten zum Beispiel die Daten aus der Datenbank und in eine Python-Liste zeichnen und die Python-Liste mit einer numpligen Funktion versehen:

%Vor%

Wenn Noten ein numpliges strukturiertes Array sind, können Sie niemals auf diese Weise auf Werte zugreifen:

%Vor%

da auf Spalten über den Namen zugegriffen wird und auf Zeilen über Integer zugegriffen wird.

Ich glaube jedoch nicht, dass dies ein großes Hindernis darstellt. Hier ist warum: Alles, was Sie für einen Schüler tun möchten (wie die Summe aller Zuweisungspunkte), werden Sie wahrscheinlich für jeden Schüler machen wollen.

Der Trick mit numpy - dem Weg, seine Macht zu nutzen - besteht also darin, vektorisierte Gleichungen zu schreiben oder numpy Funktionen zu verwenden, die für alle Zeilen gleichzeitig gelten, anstatt einzeln über die Zeilen zu laufen. Anstatt auf einer individuellen Skala zu denken (zB einzelne Schüler, individuelle Aufgaben), ermutigt numpy Sie, auf einer größeren Skala zu denken (zB alle Schüler, alle Aufgaben) und zu tun Berechnungen, die für alle auf einmal gelten.

Wie Sie mit Ihrem Streit mit Ansichten gesehen haben, sind Sie eigentlich besser dran, nicht zu verwenden ein strukturiertes Array, stattdessen für eine einfache 2-Achsen-numpy-Array:

Stellen wir uns vor, die Spalten repräsentieren (2) Zuweisungen und die Zeilen repräsentieren (4) Schüler.

%Vor%

Hier sind einige Statistiken:

%Vor%

Nun nehmen wir an, das sind die Namen der Schüler:

%Vor%

Um die Namen der Schüler mit ihrer durchschnittlichen Punktzahl zu vergleichen, könnten Sie das Diktat erstellen

%Vor%

Und ebenso für Zuweisungen:

%Vor%     
unutbu 12.10.2010 00:32
quelle
3

Sie sollten sich das Pandas-Modul ansehen, das genau das tut, was Sie brauchen. Ссылка

    
Gregor 16.09.2013 13:37
quelle

Tags und Links