array von strings

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

numpy erlaubt wohl nur arrays mit numerischen Elementen, weshalb ich nach einer Lösung für ein array von Strings suche.

Code: Alles auswählen

array[12][3]=[
                       ['Spannung','U1','V'],
                       ['Strom','I1','mA'],
                             ...
                       ['etwa',' ','so']
                  ]
Wie gehe ich das am besten an?

--
Grüße
Christoph
--
Grüße
Christoph
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Im Allgemeinen: mit Listen oder Tupeln. Bei dir im Speziellen? Das hängt davon ab, was du mit den Daten machen willst.
Das Leben ist wie ein Tennisball.
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

EyDu hat geschrieben:Im Allgemeinen: mit Listen oder Tupeln. Bei dir im Speziellen? Das hängt davon ab, was du mit den Daten machen willst.
Ich will jeweils auf die 3 Elemente einer Zeile indiziert zugreifen, also

Code: Alles auswählen

ueberschrift = array[i][0]
groesse = array[i][1]
einheit = array[i][2]
Zuletzt geändert von Krischu am Donnerstag 30. Januar 2014, 17:00, insgesamt 1-mal geändert.
--
Grüße
Christoph
BlackJack

@Krischu: Wie schon gesagt: Listen.
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

BlackJack hat geschrieben:@Krischu: Wie schon gesagt: Listen.
Habe jetzt doch eine schönere Methode mit numpy arrays gefunden:

Code: Alles auswählen

self.header=np.empty((i, 3), dtype=object)

Erlaubt es dann im weiteren Verlauf Stringzuweisungen zu machen:

Code: Alles auswählen

                self.header[i][0]=f.readline().rstrip()
                self.header[i][1]=f.readline().rstrip()
                self.header[i][2]=f.readline().rstrip()
--
Grüße
Christoph
BlackJack

@Krischu: Äh, das ist nicht schön sondern MEGAHÄSSLICH. Wenn man so einen Murks macht, dann möchte man nicht in Python programmieren. Echt nicht.
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

BlackJack hat geschrieben:@Krischu: Äh, das ist nicht schön sondern MEGAHÄSSLICH. Wenn man so einen Murks macht, dann möchte man nicht in Python programmieren. Echt nicht.
So, dann begründe es bitte mal, was daran "megahäßlich" oder Murks sein soll :)

Sonst sage mir wie ich, Tupel oder Listen adressieren soll.
--
Grüße
Christoph
BlackJack

@Krischu: Du verwendest hier Python nicht wie Python sondern wie eine Sprache wo man Arrays vorher in der passenden Grösse anfordert und dann füllt und dabei Indexvariablen verwendet. Das ist kein idiomatisches Python.

Wie man Dein konkretes Problem in Python löst, lässt sich ohne das Problem zu kennen nicht so einfach sagen. In der Regel kommt man ohne Indexvariablen aus. Listen werden dynamisch aufgebaut und über die Elemente kann man direkt iterieren, ohne den Umweg über einen Index.
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

BlackJack hat geschrieben:@Krischu: Du verwendest hier Python nicht wie Python sondern wie eine Sprache wo man Arrays vorher in der passenden Grösse anfordert und dann füllt und dabei Indexvariablen verwendet. Das ist kein idiomatisches Python.

Wie man Dein konkretes Problem in Python löst, lässt sich ohne das Problem zu kennen nicht so einfach sagen. In der Regel kommt man ohne Indexvariablen aus. Listen werden dynamisch aufgebaut und über die Elemente kann man direkt iterieren, ohne den Umweg über einen Index.
Gut, ich will es mal etwas präzisieren:

Ich habe eine Datei, die Daten in Form von Zeilen und Spalten enthält. Die Spalten haben auch Überschriften, ähnlich wie in einer CSV-Datei. Es kommen immer 3 Zeilen hintereinander, die

1. physik.Größe
2. Name der Größe
3. Einheit der Größe

als String enthalten.

Wieviele davon kommen, weiß ich a priori nicht. Erst wenn eine Zeile mit Tabs kommt, dann weiß ich, daß es eine Datenzeile ist. Dann kommen nur noch Zeilen mit Tabs bis das irgendwann mal aufhört und dann kommt noch ein Nachspann, der weggeworfen wird.

Das ist mein reales Alltagsproblem, für das es eine handliche Klasse oder Funktion zu entwerfen galt.
Neben dem Datenarray (2-dimensional), daß floating point Daten enthält, interessieren mich noch die obigen header (1.-3.),
die ich bitteschön adressieren können möchte. Auch ein reales Bedürfnis.

Jetzt sag mir bitte, wie man das elegant mit der "beauty" von Python löst? Ich bin Realist und muß am Ende des Tages auch mal fertig sein und liefern.
--
Grüße
Christoph
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Listen. Es bleibt bei Listen.

Edit: Oder NamedTuple in Listen.
Das Leben ist wie ein Tennisball.
BlackJack

Nicht über das kleine Beispiel unten hinaus getestet:

Code: Alles auswählen

from collections import namedtuple
from itertools import chain, takewhile
from pprint import pprint
import numpy as np


Header = namedtuple('Header', 'name variable unit')


def load_special_format(filename):
    with open(filename, 'r') as lines:
        lines = (line.rstrip() for line in lines)

        headers = list()
        for line in lines:
            if '\t' in line:
                break
            headers.append(Header(line, next(lines), next(lines)))

        value_lines = takewhile(lambda s: '\t' in s, chain([line], lines))
        values = chain.from_iterable((line.split() for line in value_lines))
        array = np.fromiter(values, np.float).reshape((-1, len(headers)))

    return headers, array


def main():
    pprint(load_special_format('test.txt'))


if __name__ == '__main__':
    main()
Testdaten:

Code: Alles auswählen

Spannung
U1
V
Strom
I1
mA
1	2
3	4
5	6
Und noch ein Nachspann...
der ignoriert wird.
Ausgabe:

Code: Alles auswählen

([Header(name='Spannung', variable='U1', unit='V'),
  Header(name='Strom', variable='I1', unit='mA')],
 array([[ 1.,  2.],
       [ 3.,  4.],
       [ 5.,  6.]]))
Antworten