:
>> data = struct('A',{}, 'B', {});
>> for s=1:1;5
data(s).A = s
for t=1:1:3
data(s).B(t) = s+t
end;
end;
はscipy.io.loadmat
とでnumpy
こと
>> data.A
ans = 1
ans = 2
ans = 3
ans = 4
ans = 5
>> data.B
ans =
2 3 4
ans =
3 4 5
ans =
4 5 6
ans =
5 6 7
ans =
6 7 8
>> save -7 stack47277436.mat data
読み込み製造:squeeze_me
と
In [17]: res = loadmat('stack47277436.mat')
In [18]: res
Out[18]:
{'__globals__': [],
'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.0.0, 2017-11-14 04:48:21 UTC',
'__version__': '1.0',
'data': array([[(array([[ 1.]]), array([[ 2., 3., 4.]])),
(array([[ 2.]]), array([[ 3., 4., 5.]])),
(array([[ 3.]]), array([[ 4., 5., 6.]])),
(array([[ 4.]]), array([[ 5., 6., 7.]])),
(array([[ 5.]]), array([[ 6., 7., 8.]]))]],
dtype=[('A', 'O'), ('B', 'O')])}
や負荷が特異寸法を除去するために
In [22]: res = loadmat('stack47277436.mat',squeeze_me=True)
In [24]: res['data']
Out[24]:
array([(1.0, array([ 2., 3., 4.])), (2.0, array([ 3., 4., 5.])),
(3.0, array([ 4., 5., 6.])), (4.0, array([ 5., 6., 7.])),
(5.0, array([ 6., 7., 8.]))],
dtype=[('A', 'O'), ('B', 'O')])
In [25]: _.shape
Out[25]: (5,)
はstruct
フィールドに対応する、2つのフィールドで構造化された配列に翻訳された
In [26]: res['data']['A']
Out[26]: array([1.0, 2.0, 3.0, 4.0, 5.0], dtype=object)
In [27]: res['data']['B']
Out[27]:
array([array([ 2., 3., 4.]), array([ 3., 4., 5.]),
array([ 4., 5., 6.]), array([ 5., 6., 7.]),
array([ 6., 7., 8.])], dtype=object)
A
アレイ(オブジェクトDTYPE)である(MATLABの名前は?ということです)。 B
もオブジェクトdtypeですが、配列を含んでいます。これは、loadmat
がMATLABセルを処理する方法です。
MATLAB構造体は、属性がA
およびB
のカスタムクラスとして実装することも、それらのキーを持つ辞書として実装することもできます。
私はpandas
よりnumpy
良く知っているが、データフレームの中に、この配列を入れて試すことができます:
In [28]: import pandas as pd
In [29]: df = pd.DataFrame(res['data'])
In [30]: df
Out[30]:
A B
0 1 [2.0, 3.0, 4.0]
1 2 [3.0, 4.0, 5.0]
2 3 [4.0, 5.0, 6.0]
3 4 [5.0, 6.0, 7.0]
4 5 [6.0, 7.0, 8.0]
In [31]: df.dtypes
Out[31]:
A object
B object
dtype: object
numpy
でフィールドをクリーンアップし、変数に割り当てることができます。
In [37]: A = res['data']['A'].astype(int)
In [38]: B = np.stack(res['data']['B'])
In [39]: A
Out[39]: array([1, 2, 3, 4, 5])
In [40]: B
Out[40]:
array([[ 2., 3., 4.],
[ 3., 4., 5.],
[ 4., 5., 6.],
[ 5., 6., 7.],
[ 6., 7., 8.]])
1つは(5、)形状の配列であり、もう1つ(5,3)の配列です。
私は戻ってきれいDTYPEと構造化された配列にそれらを詰めることができます:
In [48]: C = np.empty((5,), [('A',int), ('B', int, (3,))])
In [49]: C['A'] = A
In [50]: C['B'] = B
In [51]: C
Out[51]:
array([(1, [2, 3, 4]), (2, [3, 4, 5]), (3, [4, 5, 6]), (4, [5, 6, 7]),
(5, [6, 7, 8])],
dtype=[('A', '<i4'), ('B', '<i4', (3,))])