2017-01-17 15 views
2

きれいに生成されたデータを.matファイルに保存するためのいくつかの問題があります。私はそれがシピーでもっと簡単だと思ったが、何かが間違っているようだ。PythonからScipyでMatlabに辞書を保存する

これは私が保存するデータの例である:

out = {'features': array([[ 5.00088905e+01, 1.51847522e+01, 4.93513862e+01, 
      3.76548415e+00, -3.96946513e+01, -2.11885850e+01, 
      9.85304035e+00, -6.30005764e+00, 1.19987435e+01, 
      3.89762536e+00, -1.31554755e+00, -1.66890836e+01, 
      4.75289017e-02, 3.65829480e-01, -4.77872832e-01, 
      1.13641908e+00, -1.08742775e-01, -2.42751445e-01, 
     -1.13054913e-01, 3.39011561e-01, 1.37158960e-01, 
     -2.80760116e-01, -4.15187861e-01, 9.85433526e-02, 
     -8.66144928e-02, 9.18260870e-03, -7.38139130e-01, 
      8.04136232e-01, 2.31623188e-02, -7.88927536e-02, 
     -2.17779710e-01, 2.85428986e-01, -8.16231884e-02, 
      1.79710145e-03, -3.47710145e-01, -9.84115942e-02, 
      3.96077031e+00, 3.29914828e+01, 2.60086805e+01, 
      2.44418378e+01, 2.01712577e+01, 1.56827627e+01, 
      1.59131122e+01, 1.84134126e+01, 1.63149310e+01, 
      1.35579058e+01, 1.15772911e+01, 1.82263123e+01, 
      3.96077031e+00, 3.29914828e+01, 2.60086805e+01, 
      2.44418378e+01, 2.01712577e+01, 1.56827627e+01, 
      1.59131122e+01, 1.84134126e+01, 1.63149310e+01, 
      1.35579058e+01, 1.15772911e+01, 1.82263123e+01, 
      3.96077031e+00, 3.29914828e+01, 2.60086805e+01, 
      2.44418378e+01, 2.01712577e+01, 1.56827627e+01, 
      1.59131122e+01, 1.84134126e+01, 1.63149310e+01, 
      1.35579058e+01, 1.15772911e+01, 1.82263123e+01]]), 'tags': [['rock', 'metal']]} 

それはタグのリスト(長さ可変)に関連付けることができる行列の単一行です。

考え方は、マトリックスとリストのセル配列を持つ.matファイルを持つことでした。私がこのために行くとき:

scipy.io.savemat('./test.mat',out) 

タグのMatlabの結果は様々です。私は行列の代わりに比べて、単一の行ベクトルのためにしようとした場合たとえば、私は1x2x5チャー行列

val(:,:,1) = rm  
val(:,:,2) = oe  
val(:,:,3) = ct  
val(:,:,4) = ka  
val(:,:,5) =  l 

を持っている上に、私はすべての行のセルとセル配列を取得しますが、リストがマージされ、用セル特定の行はrmoectkalになります。

イルは、例を挙げて説明しよう:

>>> genre_tags_matrix = np.array(genre_tags, dtype=np.object) 
>>> print(genre_tags_matrix) 
[['classical', 'pop'] ['classical'] ['classical'] ['classical']] 
>>> out = {'tags' : genre_tags_matrix} 
>>> scipy.io.savemat('./test.mat',out) 

これは私がMATLABで見るものです:

matscreen

起こっている正確にどのような?このための回避策はありますか?

答えて

0

問題は、我々はそれを作るために数字と文字を置き換える場合は、次の文は、3次元配列

[['rock', 'metal']] 

実際あるので、MATLABおよびオクターブ内の文字列は、実際には文字の配列だけであるということですそれはあなたがそれのように扱われるだろうsavemat.matファイルにこれらのいずれかを保存すると、我々はこの

[[[1,2,3], [4,5,6]]] 

ような何かを得る3D配列だと少し明確に3D配列。

代わりにセル配列が必要な場合は、numpyオブジェクトのnumpy配列を手動で作成する必要があります。その後

data = load('test.mat') 
% tags = 
% { 
%  [1,1] = rock 
%  [1,2] = metal 
% } 

更新がネストされたセルアレイの場合には

、あなたはセル配列になりたい各レベルがなければならないMATLABやオクターブ内

import scipy 
import numpy as np 

out = {'tags': np.array(['rock', 'metal'], dtype=np.object)} 

scipy.io.savemat('test.mat', out) 

はnumpy個のオブジェクトのnumpy配列である

out = {'tags': np.array([ 
      np.array(['classical', 'pop'], dtype=np.object), # A nested cell array 
      'classical', 'classical', 'classical'], dtype=np.object)} 
+0

これは単列行列の問題を効果的に解決しましたが、可変長リストを値として持つ辞書のキーを処理する必要がある場合でも成功しません。私はその問題の例を編集した。 – sparaflAsh

+0

@sparaflAshアップデートを参照してください。あなたがセル配列になりたいものは、明示的に 'np.object'配列として定義されなければなりません – Suever

+0

それは魅力的に機能しました! – sparaflAsh

関連する問題