Textdatein einlesen und in Array speichern

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
Kruemel
User
Beiträge: 6
Registriert: Dienstag 14. Mai 2013, 13:01

Hallo zusammen,

ich hab ein Problem mit einem kleinen Python-Skript.
Mein Ziel ist es mehrer Textdatein mit komplexen Zahlen einzulesen und diese georndet in einem Array der Form shape=(3,6) darzustellen.

Code: Alles auswählen

import numpy,sys

#######################################################

def CreateArray(argv):
        a=numpy.array

        for arg in sys.argv:                
	        value=numpy.loadtxt(arg)

                for row in a:
                        a.append(value)
                print a
###########################################

if __name__=='__main__':
        CreateArray(sys.argv[1:])

Eingabe in der Shell ist
Python CreateArray.py Test*
Das ganze sollte dann am schluss in dieser Form dastehen

Code: Alles auswählen

array([[ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j]])
Nur mit den Werten aus den Textdatein ;)
Geht es generell überhaupt die Initilisierung nur so vorzunehmen oder sollte man eher schreiben

Code: Alles auswählen

a=numpy.array(shape=(3,6),dtype=complex)
Die Fehlermeldung die er mir auch immer ausgibt ist:
ValueError: could not convert string to float: import
Bin leider noch nicht so erfahren mit Python :(
Bin um jede Hilfe dankbar!
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

Nimm

Code: Alles auswählen

for arg in argv:
statt

Code: Alles auswählen

for arg in sys.argv:
dann versucht das Programm nicht, deinen Quelltext einzulesen :-)
http://www.florian-diesch.de
BlackJack

@Kruemel: Der gezeigte Quelltext macht hinten und vorne keinen Sinn. `a` wird an die Funktion `numpy.array()` gebunden, der Quelltext führt wegen falscher Einrückung zu einem `SyntaxError`, über die an `a` gebundene Funktion kann man weder iterieren, noch hat sie eine `append()`-Methode. Selbst wenn `a` an ein `numpy`-Array gebunden wäre macht das keinen Sinn und eine `append()`-Methode hat dieser Datentyp ebenfalls nicht.

Das Array solltest Du letztendlich gar nicht initialisieren, denn `loadtxt()` liefert doch schon ein fertiges Array mit der Werten aus der Datei. Der Funktion solltest Du aber beim Aufruf den Datentyp mitgeben, den die Werte in der Datei haben, wenn der von Python's `float`-Typ abweichen sollte.

Programmieren funktioniert nicht so dass man rät wie der Quelltext vielleicht aussehen mag, der das macht, was man haben möchte, solange bis man richtig geraten hat, sondern in dem man gezielt einzelne Ausdrücke von denen man *weiss* was sie tun, zu einer grösseren Lösung zusammen setzt.

Dazu musst Du das Gesamtproblem in kleinere Teilprobleme zerlegen bis diese trivial lösbar sind. Die löst man dann und setzt sie zu einer Gesamtlösung zusammen.

Was steht überhaupt in den Dateien? Also welche Werte aus welcher Datei sollen am Ende wo im Ergebnis stehen?
Kruemel
User
Beiträge: 6
Registriert: Dienstag 14. Mai 2013, 13:01

BlackJack hat geschrieben: Programmieren funktioniert nicht so dass man rät wie der Quelltext vielleicht aussehen mag, der das macht, was man haben möchte, solange bis man richtig geraten hat, sondern in dem man gezielt einzelne Ausdrücke von denen man *weiss* was sie tun, zu einer grösseren Lösung zusammen setzt.

Dazu musst Du das Gesamtproblem in kleinere Teilprobleme zerlegen bis diese trivial lösbar sind. Die löst man dann und setzt sie zu einer Gesamtlösung zusammen.

Was steht überhaupt in den Dateien? Also welche Werte aus welcher Datei sollen am Ende wo im Ergebnis stehen?
Ja ok, das werd ich mir zu Herzen nehmen.
In den Datein stehen 6 komplexe Zahlen "X +jY". Die ersten 6 komplexen Zahlen sollen in dem ersten Spalte des Arrays gespeichert werden, die Zweiten in der zweiten Spalte usw.

Dann würde ich a zu einer Liste machen.
BlackJack

@Kruemel: Die Beschreibung deckt sich jetzt aber nicht mit dem Wunschergebnis aus dem ersten Beitrag, denn da sind es drei Zeilen mit je sechs Werten und keine drei Spalten mit je sechs Werten.

Eventuell könnte das `fileinput`-Modul aus der Standardbibliothek interessant für Dich sein.
Kruemel
User
Beiträge: 6
Registriert: Dienstag 14. Mai 2013, 13:01

BlackJack hat geschrieben:@Kruemel: Die Beschreibung deckt sich jetzt aber nicht mit dem Wunschergebnis aus dem ersten Beitrag, denn da sind es drei Zeilen mit je sechs Werten und keine drei Spalten mit je sechs Werten.

Eventuell könnte das `fileinput`-Modul aus der Standardbibliothek interessant für Dich sein.
ok, schuldigung. Es sollte lauten "Die ersten 3 komplexen Zahlen sollen in dem ersten Spalte des Arrays gespeichert werden, die Zweiten in der zweiten Spalte usw."
Ich sollte für heute Schluss machen... :oops:
Danke schonmal für den Tipp mit den "fileinput"-Modul, werde ich mir Morgen anschauen.
BlackJack

@Kruemel: Das ist IMHO immer noch nicht so klar. Wenn eine Datei sechs komplexe Zahlen enthält, dann soll jede Datei zwei Spalten im Ergebnis füllen? Und wie sehen die Dateien genau aus? Alle komplexen Zahlen in einer Zeile, eine Zeile pro komplexer Zahl, oder zwei Spalten mit je drei Werten? Oder ganz anders?
Kruemel
User
Beiträge: 6
Registriert: Dienstag 14. Mai 2013, 13:01

Nachdem ich mich jetzt nochmal ein bisschen umgesehen habe, habe ich etwas besseres für meine Zwecke gefunden. h5py!
Ich glaube damit wird auch ein bisschen klarer was mein eigentliches Ziel ist:

Code: Alles auswählen

import numpy,sys
import h5py as H5


#######################################################

def CreateH5(argv):
        F=H5.File("test.h5","w")
        dset=F.create_dataset('test12',(3,6),dtype='complex128')

        for arg in argv:
                value = numpy.loadtxt(arg)
                value1=value[:,1]*numpy.exp(value[:,-1]*1j*(180./numpy.pi))

                for i in range(dset):
                        dset[i,]=value1
                        i+=1

if __name__=='__main__':
        CreateH5(sys.argv[1:])
Die zwei Zeilen mit dem S11* erstellen nur aus einer Textdatei komplexe Zahlen. Pro Textdatei 3 Stück!

Diese möchte ich jetzt in Spalten in dem Datensatz speichern.Die ersten 3 Zaheln in die erste Spalte usw.. Mein Problem ist bei dem letzten Absatz. Ich weiß nicht wie genau ich das machen soll, dass er die Spaltenweiße in dset speichert.
Zuletzt geändert von Anonymous am Montag 20. Mai 2013, 14:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Kruemel: Das ist Quelltext der nicht fehlerfrei läuft, und zwar an einer Stelle auf die Nase fällt, die noch überhaupt nichts mit einer spaltenweise Zuweisung zu tun hat:

Code: Alles auswählen

In [10]: range(dset)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/bj/<ipython-input-10-c0642abc972a> in <module>()
----> 1 range(dset)

TypeError: range() integer end argument expected, got Dataset.
Die Frage wie die Dateien denn nun genau aussehen hast Du immer noch nicht beantwortet. Ohne das zu wissen, kann hier niemand wissen wie `value` aussehen wird und folglich auch nicht wie `value1` aussieht, und damit auch nicht wie man das einer Spalte in `dset` zuweisen kann. Man kann jetzt höchstens raten. Und wenn ich mal raten müsste, dann weisst Du bereits wie man auf eine Spalte zugreift, denn das machst Du im vorhandenen Quelltext schon lesend. Man kann das genau so auf der linken Seite einer Zuweisung schreiben. Und Du musst Dir klar werden wo die Schleife ist, die das `i` verwalten muss. Wenn Du das heraus hast, dann schau Dir mal die `enumerate()`-Funktion an.

Edit: Die Namen könnte fast alle deutlich besser sein. Bitte keine Namen abkürzen wenn die Abkürzung nicht allgemein bekannt ist, keine Namen durchnummerieren, keine Namen im Singular für Container-Objekte die viele Werte enthalten, und präziser wenn es geht. `args` sind zum Beispiel nicht irgendwelche allgemeinen Argumente, sondern in diesem Fall eindeutig `filenames`.

Einrückung ist per (ziemlich starker) Konvention vier Leerzeichen pro Ebene.
Kruemel
User
Beiträge: 6
Registriert: Dienstag 14. Mai 2013, 13:01

BlackJack hat geschrieben: Die Frage wie die Dateien denn nun genau aussehen hast Du immer noch nicht beantwortet. Ohne das zu wissen, kann hier niemand wissen wie `value` aussehen wird und folglich auch nicht wie `value1` aussieht, und damit auch nicht wie man das einer Spalte in `dset` zuweisen kann.
value1 sieht nach der Eingabe der 1. Textdatei wie folgt aus:

Code: Alles auswählen

In [5]: value1
Out[5]: 
array([ -0.53838216+0.18816186j,  -0.2363965+0.55350623j,
       0.423934004-0.26628899j])
BlackJack

@Kruemel: Na dann musst Du doch nur noch die passende Spalte von `dset` selektieren und `value1` zuweisen. Die Spalten müssen parallel zu den Dateinamen hochgezählt werden → `enumerate()`-Funktion, und wie man die Spalte selektiert, sollte man im Tutorial in der `numpy`-Dokumentation lernen. Wobei Du das wie gesagt, eigentlich schon wissen müsstest, denn Du verwendest es ja.

Gibt es eigentlich einen Grund warum Du Dich so stur anstellst was das genaue Format der Eingabedateien angeht? Soweit man das aus dem Quelltext sagen kann, sind das drei Zeilen und mindestens drei Spalten, wobei die erste Spalte Werte enthält, die nicht verwendet werden. Sollte dem nicht so sein, ist der Code wahrscheinlich falsch.

Edit: Du solltest die hdf5-Datei auch auf jeden Fall wieder schliessen. Dazu kann die ``with``-Anweisung verwendet werden.
BlackJack

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
import sys
import h5py
import numpy as np


def create_h5(filenames):
    with h5py.File('test.h5', 'w') as h5_file:
        dataset = h5_file.create_dataset('test12', (3, 6), dtype='complex128')
        for i, filename in enumerate(filenames):
            values = np.loadtxt(filename)
            # 
            # TODO: Check result because of suspicious slicing values.
            # 
            dataset[:, i] = (
                values[:, 1] * np.exp(values[:, -1]) * 1j * (180 / np.pi)
            )


def main():
    create_h5(sys.argv[1:])


if __name__ == '__main__':
    main()
Kruemel
User
Beiträge: 6
Registriert: Dienstag 14. Mai 2013, 13:01

Habe es jetzt so gelöst:

Code: Alles auswählen

import numpy,sys
import h5py as H5


#######################################################

def CreateH5(argv):
    F=H5.File("S11.h5","w")
    dset = F.create_dataset("S-Parameter",(3,6),dtype="complex128")
   
    for i, files in enumerate(argv):
	
        values = numpy.loadtxt(files,skiprows=7)
        values1=values[:,1]*numpy.exp(S11f[:,-1]*1j*(180./numpy.pi)) 
								   
	dset[:,i]=values1

    F.close()
 
  
##############################################

if __name__=='__main__':
	CreateH5(sys.argv[1:])
Antworten