2016-08-15 48 views
1

これは私の最後の質問に関連しています。これはhereです。私はmarkerListとしてそのリンクで記述するリストに似たリストを取り扱っています - それで3つのレベルのリスト。私はこの情報を.matファイルとして保存する必要がありますが、正しいタイプで保存することはできません。 scipy.io.savematを使用している場合は、それぞれが40x2セルを含む200個のセルのセットである必要がある場合、リストを200x40x2個のシングルとして保存します。scipy.io.savematを使用してネストされたリストを保存する

私はこれを保存するために使用しているコードは次のとおりです。

matdict = dict(markers = (markerList), sorted = (finalStack)) 
scipy.io.savemat('C:\pathname\\sortedMarkers.mat', matdict) 

何私に混乱しては、それが正しい形式(1x200細胞、それぞれ様々な大きさのセル)にmarkerListを保存しますが、ではないということですfinalStack(200 x 40 x 2シングルとして保存)。さらに、このコードの残りの部分を理解する前に、finalStackを正しく保存することができました。保存しているデータのサイズが一様でない場合は、おそらくセルとして保存されると考えられます。 (finalStackのサイズは一定ですが、markerListはありません)

このような複雑なデータ構造を.matファイルとして保存する方法はありますか?

+0

はそうではありません[ XY問題](http://xyproblem.info)Matlabでこれを使用しますか?あるいは、 'scipy.io.savemat'をPythonワークスペースを保存する汎用ライブラリとして使用していますか?なぜなら後者の方が良い選択肢があるからです。 –

+0

しかし、(40,2)配列の(20、)配列を期待していた(200,40,2)配列を保存することは 'savemat'では問題になりません。私の診断が正しければ、numpyが配列のリストを配列に変換する方法に問題があります。 – hpaulj

+0

タソス - これはXYの問題ではありません。基本的に私が扱っているのはMatlabを使い、セルの配列は私が知っているネストされたリストに最も似ています。また、適切な形式で保存されたデータをバッチ処理するためのスクリプトも既に用意されています(それでもやり直せないものではありませんが、やる気にはなりません)。このようなネストされたデータを大量に保存する場合、他の形式は非常にかさばって扱いにくいようです。 – godfreap

答えて

1

、 'オブジェクト' のnumpyの配列に変換します。オクターブで

from scipy.io import savemat 
import numpy 

a = numpy.array([[1,2,3],[1,2,3]]) 
b = numpy.array([[2,3,4],[2,3,4]]) 
c = numpy.array([[3,4,5],[3,4,5]]) 
L = [a,b,c] 

FrameStack = numpy.empty((len(L),), dtype=numpy.object) 
for i in range(len(L)): 
    FrameStack[i] = L[i] 

savemat("myfile.mat", {"FrameStack":FrameStack}) 

:私はちょうどこれを確認するために、依頼する必要があり

>> load myfile.mat 

>> whos FrameStack 
Variables in the current scope: 

    Attr Name   Size      Bytes Class 
    ==== ====   ====      ===== ===== 
     FrameStack  1x3      144 cell 

Total is 3 elements using 144 bytes 

>> whos FrameStack{1} 
Variables in the current scope: 

    Attr Name    Size      Bytes Class 
    ==== ====    ====      ===== ===== 
     FrameStack{1}  2x3       48 int64 

Total is 6 elements using 48 bytes 
+0

しかし、 'A、B、C'がすべて同じ形であるとどうなりますか? – hpaulj

+0

私はあなたがここで何を得ているのかを見ていますが、私のリストの内容は関連しており、依存しています。つまり、私はfinalStack [0] [1] [0]を別々の要素に分解することはできません。その時点で意味がありません。とにかく、あなたが何を言っているのか分かりますが、ここから理解できるかもしれません... – godfreap

+0

finalStack [0] [0]が{1}(1)のPythonオブジェクトを作成する必要があることは分かります。 Matlab、しかし、私はそれを理解することはできません、したがって質問。ただし、 'b.append(finalStack [i])'の範囲( 'b = []')でリストにfinalStackを追加しても問題は解決されません。 ( 'finalStack [i]'はすべての要素に対して40x2のnp.arrayです。)それでもやっています。 – godfreap

1

あなたの以前の質問をもう一度見ることなく、私は問題が今であると考えていますnumpy.arrayは、サブリストまたは配列のリストから配列を作成します。

markerListが期待どおりに保存され、セルのサイズが異なることに注意してください。

np.array(markerList) 

を試してみて、その形状とDTYPEを見てください。私はそれが1d(200、)とオブジェクトdtypeになると推測しています。

np.array(finalStack) 

これはおそらく保存する3次元配列になります。

savematは、Python辞書とリストではなく、numpy配列を保存するように設定されています。すべてが2d行列であったMATLABと話しています。 MATLABセルはこれを一般化します。それらはdtypeオブジェクトの2次元配列のようなものです。

サイズが均一な要素からオブジェクト配列を作成する問題が頻繁に発生します。通常の解決策は、所望のサイズ(例えば、(200、))のアレイとオブジェクトタイプを作成し、その中にサブアレイをロードすることである。

https://stackoverflow.com/a/38776674/901925

=============

私が説明します。

In [59]: from scipy import io 

In [60]: A=np.ones((40,2))  
In [61]: B=np.ones((40,2)) 
In [62]: C=np.ones((30,2)) 

保存二つのリスト、ちょうど2つのアレイ、3つのすべてと他との1:3つの配列、ワンサイズの2、および異なる第三くださいそれが戻っ

In [63]: io.savemat('test.mat', {'AB':[A,B],'ABC':[A,B,C]}) 

ロード。私の代わりにoctaveでこれを行うことができます:

In [65]: D=io.loadmat('test.mat') 

In [66]: D.keys() 
Out[66]: dict_keys(['ABC', '__header__', 'AB', '__globals__', '__version__']) 

ABCは3つの要素

In [68]: D['ABC'].shape 
Out[68]: (1, 3) 
In [71]: D['ABC'][0,0].shape 
Out[71]: (40, 2) 

と2D配列であるが、3D配列にAB変換されています:代わりに私場合

In [69]: D['AB'].shape 
Out[69]: (2, 40, 2) 
In [70]: np.array([A,B]).shape 
Out[70]: (2, 40, 2) 

1次元オブジェクト配列をAとBを保持するようにすると、それは保存されます。

辞書の項目がnumpyのものと背中にMATLAB構造を翻訳の難しさを考えると、それはフラットでシンプルなものに保つのではなく、化合物を作成する方が良いでしょう

io.savemat('test.mat',{'A':A, 'B':B, 'C':C}) 

として

良い代替は配列を保存することです両面で役に立つオブジェクト。私はOctaveをインストール

===============

。ロードこのtest.mat

io.savemat('test.mat', {'AB':AB,'ABs':[A,B]}) 

は、オブジェクトDTYPE配列は、MATLABセルとして保存され

>> whos 
Variables in the current scope: 

    Attr Name  Size      Bytes Class 
    ==== ====  ====      ===== ===== 
     AB   1x2      1280 cell 
     ABs   2x40x2     1280 double 

を与えます。 MATLAB行列として他の配列。 (私は以前の答えをmatlab構造体に相当するものを思い出すために再検討しなければならないだろう)。 savemat documentationを1として

関連する問題