Dateiverwaltung (scipy.io)#
Siehe auch
MATLAB-Dateien#
|
MATLAB-Datei laden. |
|
Ein Wörterbuch von Namen und Arrays in eine .mat-Datei im MATLAB-Stil speichern. |
|
Variablen in einer MATLAB-Datei auflisten. |
Die grundlegenden Funktionen#
Wir beginnen mit dem Import von scipy.io und nennen es der Einfachheit halber sio
>>> import scipy.io as sio
Wenn Sie IPython verwenden, versuchen Sie es mit Tab-Vervollständigung auf sio. Unter den vielen Optionen finden Sie
sio.loadmat
sio.savemat
sio.whosmat
Dies sind die High-Level-Funktionen, die Sie am wahrscheinlichsten bei der Arbeit mit MATLAB-Dateien verwenden werden. Sie werden auch finden
sio.matlab
Dies ist das Paket, aus dem loadmat, savemat und whosmat importiert werden. Innerhalb von sio.matlab finden Sie das Modul mio. Dieses Modul enthält die Maschinerie, die loadmat und savemat verwenden. Von Zeit zu Zeit werden Sie diese Maschinerie wiederverwenden.
Wie fange ich an?#
Sie haben möglicherweise eine .mat-Datei, die Sie in SciPy lesen möchten. Oder Sie möchten einige Variablen von SciPy / NumPy nach MATLAB übergeben.
Um uns die Verwendung einer MATLAB-Lizenz zu ersparen, beginnen wir in Octave. Octave verfügt über MATLAB-kompatible Speicher- und Ladefunktionen. Starten Sie Octave (octave auf der Kommandozeile bei mir)
octave:1> a = 1:12
a =
1 2 3 4 5 6 7 8 9 10 11 12
octave:2> a = reshape(a, [1 3 4])
a =
ans(:,:,1) =
1 2 3
ans(:,:,2) =
4 5 6
ans(:,:,3) =
7 8 9
ans(:,:,4) =
10 11 12
octave:3> save -6 octave_a.mat a % MATLAB 6 compatible
octave:4> ls octave_a.mat
octave_a.mat
Nun zu Python
>>> mat_contents = sio.loadmat('octave_a.mat')
>>> mat_contents
{'__header__': b'MATLAB 5.0 MAT-file, written
by Octave 3.2.3, 2010-05-30 02:13:40 UTC',
'__version__': '1.0',
'__globals__': [],
'a': array([[[ 1., 4., 7., 10.],
[ 2., 5., 8., 11.],
[ 3., 6., 9., 12.]]])}
>>> oct_a = mat_contents['a']
>>> oct_a
array([[[ 1., 4., 7., 10.],
[ 2., 5., 8., 11.],
[ 3., 6., 9., 12.]]])
>>> oct_a.shape
(1, 3, 4)
Versuchen wir nun den umgekehrten Weg
>>> import numpy as np
>>> vect = np.arange(10)
>>> vect.shape
(10,)
>>> sio.savemat('np_vector.mat', {'vect':vect})
Dann zurück zu Octave
octave:8> load np_vector.mat
octave:9> vect
vect =
0 1 2 3 4 5 6 7 8 9
octave:10> size(vect)
ans =
1 10
Wenn Sie den Inhalt einer MATLAB-Datei inspizieren möchten, ohne die Daten in den Speicher zu laden, verwenden Sie den Befehl whosmat
>>> sio.whosmat('octave_a.mat')
[('a', (1, 3, 4), 'double')]
whosmat gibt eine Liste von Tupeln zurück, eines für jedes Array (oder ein anderes Objekt) in der Datei. Jedes Tupel enthält den Namen, die Form und den Datentyp des Arrays.
MATLAB-Strukturen#
MATLAB-Strukturen sind ein wenig wie Python-Wörterbücher, mit dem Unterschied, dass die Feldnamen Zeichenketten sein müssen. Jedes MATLAB-Objekt kann ein Wert eines Feldes sein. Wie bei allen Objekten in MATLAB sind Strukturen tatsächlich Arrays von Strukturen, wobei eine einzelne Struktur ein Array der Form (1, 1) ist.
octave:11> my_struct = struct('field1', 1, 'field2', 2)
my_struct =
{
field1 = 1
field2 = 2
}
octave:12> save -6 octave_struct.mat my_struct
Wir können dies in Python laden
>>> mat_contents = sio.loadmat('octave_struct.mat')
>>> mat_contents
{'__header__': b'MATLAB 5.0 MAT-file, written by Octave 3.2.3, 2010-05-30 02:00:26 UTC',
'__version__': '1.0',
'__globals__': [],
'my_struct': array([[(array([[1.]]), array([[2.]]))]], dtype=[('field1', 'O'), ('field2', 'O')])
}
>>> oct_struct = mat_contents['my_struct']
>>> oct_struct.shape
(1, 1)
>>> val = oct_struct[0, 0]
>>> val
np.void((array([[1.]]), array([[2.]])), dtype=[('field1', 'O'), ('field2', 'O')])
>>> val['field1']
array([[ 1.]])
>>> val['field2']
array([[ 2.]])
>>> val.dtype
dtype([('field1', 'O'), ('field2', 'O')])
In den SciPy-Versionen ab 0.12.0 kommen MATLAB-Strukturen als NumPy-strukturierte Arrays zurück, wobei die Felder nach den Strukturfeldern benannt sind. Sie können die Feldnamen in der obigen dtype-Ausgabe sehen. Beachten Sie auch
>>> val = oct_struct[0, 0]
und
octave:13> size(my_struct)
ans =
1 1
Daher muss das Struktur-Array in MATLAB mindestens 2-dimensional sein, und wir replizieren dies beim Lesen in SciPy. Wenn Sie möchten, dass alle Längen-1-Dimensionen herausgequetscht werden, versuchen Sie dies
>>> mat_contents = sio.loadmat('octave_struct.mat', squeeze_me=True)
>>> oct_struct = mat_contents['my_struct']
>>> oct_struct.shape
()
Manchmal ist es bequemer, MATLAB-Strukturen als Python-Objekte anstelle von NumPy-strukturierten Arrays zu laden. Es kann die Zugriffssyntax in Python der in MATLAB ähneln. Um dies zu tun, verwenden Sie die Parameterinstellung struct_as_record=False für loadmat.
>>> mat_contents = sio.loadmat('octave_struct.mat', struct_as_record=False)
>>> oct_struct = mat_contents['my_struct']
>>> oct_struct[0,0].field1
array([[ 1.]])
struct_as_record=False funktioniert gut mit squeeze_me
>>> mat_contents = sio.loadmat('octave_struct.mat', struct_as_record=False, squeeze_me=True)
>>> oct_struct = mat_contents['my_struct']
>>> oct_struct.shape # but no - it's a scalar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'mat_struct' object has no attribute 'shape'
>>> type(oct_struct)
<class 'scipy.io.matlab._mio5_params.mat_struct'>
>>> oct_struct.field1
1.0
Das Speichern von Struktur-Arrays kann auf verschiedene Arten erfolgen. Eine einfache Methode ist die Verwendung von Wörterbüchern
>>> a_dict = {'field1': 0.5, 'field2': 'a string'}
>>> sio.savemat('saved_struct.mat', {'a_dict': a_dict})
geladen als
octave:21> load saved_struct
octave:22> a_dict
a_dict =
scalar structure containing the fields:
field2 = a string
field1 = 0.50000
Sie können Strukturen auch wieder in MATLAB (oder in unserem Fall Octave) speichern, indem Sie Folgendes tun
>>> dt = [('f1', 'f8'), ('f2', 'S10')]
>>> arr = np.zeros((2,), dtype=dt)
>>> arr
array([(0.0, ''), (0.0, '')],
dtype=[('f1', '<f8'), ('f2', 'S10')])
>>> arr[0]['f1'] = 0.5
>>> arr[0]['f2'] = 'python'
>>> arr[1]['f1'] = 99
>>> arr[1]['f2'] = 'not perl'
>>> sio.savemat('np_struct_arr.mat', {'arr': arr})
MATLAB Cell-Arrays#
Cell-Arrays in MATLAB ähneln eher Python-Listen, in dem Sinne, dass die Elemente der Arrays jeden Typ von MATLAB-Objekt enthalten können. Tatsächlich sind sie NumPy-Objekt-Arrays am ähnlichsten, und so laden wir sie in NumPy.
octave:14> my_cells = {1, [2, 3]}
my_cells =
{
[1,1] = 1
[1,2] =
2 3
}
octave:15> save -6 octave_cells.mat my_cells
Zurück zu Python
>>> mat_contents = sio.loadmat('octave_cells.mat')
>>> oct_cells = mat_contents['my_cells']
>>> print(oct_cells.dtype)
object
>>> val = oct_cells[0,0]
>>> val
array([[ 1.]])
>>> print(val.dtype)
float64
Das Speichern in einem MATLAB Cell-Array beinhaltet einfach die Erstellung eines NumPy-Objekt-Arrays
>>> obj_arr = np.zeros((2,), dtype=object)
>>> obj_arr[0] = 1
>>> obj_arr[1] = 'a string'
>>> obj_arr
array([1, 'a string'], dtype=object)
>>> sio.savemat('np_cells.mat', {'obj_arr': obj_arr})
octave:16> load np_cells.mat
octave:17> obj_arr
obj_arr =
{
[1,1] = 1
[2,1] = a string
}
IDL-Dateien#
|
Eine IDL .sav-Datei lesen. |
Matrix Market-Dateien#
|
Gibt Größe und Speicherparameter aus einer Matrix Market-Datei-ähnlichen 'source' zurück. |
|
Liest den Inhalt einer Matrix Market-Datei-ähnlichen 'source' in eine Matrix. |
|
Schreibt das Sparse- oder dichte Array a in eine Matrix Market-Datei-ähnliche target. |
Wav-Sounddateien (scipy.io.wavfile)#
Arff-Dateien (scipy.io.arff)#
|
Liest eine ARFF-Datei. |
Netcdf#
|
Ein Dateiobjekt für NetCDF-Daten. |
Ermöglicht das Lesen von NetCDF-Dateien (Version des Pakets pupynere)