Seite 1 von 1
array von strings
Verfasst: Donnerstag 30. Januar 2014, 15:04
von Krischu
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
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 15:07
von EyDu
Im Allgemeinen: mit Listen oder Tupeln. Bei dir im Speziellen? Das hängt davon ab, was du mit den Daten machen willst.
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 15:10
von Krischu
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]
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 15:26
von BlackJack
@Krischu: Wie schon gesagt: Listen.
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 15:40
von Krischu
BlackJack hat geschrieben:@Krischu: Wie schon gesagt: Listen.
Habe jetzt doch eine schönere Methode mit numpy arrays gefunden:
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()
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 16:06
von 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.
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 16:54
von Krischu
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.
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 17:14
von 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.
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 17:30
von Krischu
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.
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 17:35
von EyDu
Listen. Es bleibt bei Listen.
Edit: Oder NamedTuple in Listen.
Re: array von strings
Verfasst: Donnerstag 30. Januar 2014, 18:11
von 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.]]))