2

私はmatlabとpythonに非常に慣れていないため、matlabセル配列からpythonでいくつかの値を使用する必要があります。

このコード行を実行して結果を出力すると、次のようになる整数のセル配列があります。

a = loadmat('file.mat')
print a

{'__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011', 'juncForward_c': array([[ [[ [[ ([[30]], **[[91], [87]]**, [[3]], [[2.2455372690184494, 3.6052402625905993, 5.5884470309828833]], [[14.0, 4.0, 15.4]], [[-1, -1, 2]], [[91, 89, 93], [88, 85, 86]], [[500, 500, 5]], [[1, 2, 3]], [[11.133333333333333]], **[[4]]**, [[1]], [[1]], [[1.0], [20.365168528421695]])]]

[[ ([[30]], **[[99], [80]]**, [[3]], [[4.0376480381611373, 2.3561944901923448, 6.0857897473297058]], [[10.0, 15.4, 16.600000000000001]], [[-1, 1, 3]], [[98, 98, 100], [79, 81, 80]], [[500, 6, 33]], [[1, 2, 3]], **[[14]]**, [[2]], [[1]], [[1]], [[2.0], [6.6573267908372973]])]]

そしてプリントアウトは続きます。

誰かがセル配列がどのように配置されているか説明してもらえますか? (上の次元は何次元ですか?)

次に、いくつかの質問があります: 1) このセル配列内には、1 つの配列/セルに割り当てられた変数「ラベル」と「座標」があります (使用する実際の用語はわかりません) - 太字の値. この値にアクセスするために Python で書きたいと思います。どうすればいいですか?

2)テストするために、これを試しました->juncInfoF = a.get('juncForward_c')そして、juncInfoFを印刷しようとすると、「なし」と印刷されます。どうしてこんなことに?以前にこれを試したときにうまくいくので、私は困惑しています。私もこれを行うことができました-> print juncInfo[0][9][0][0]. しかし今、私は上記のことさえできません。

4

2 に答える 2

1

dict クラスから継承された shelve クラスloadmat('file.mat')インスタンスを返すと思います。scipy.io の loadmat 関数を使用していると思いますか?

from scipy.io import loadmat

scipy docはloadmat() が辞書を返すことについてのみ言及していますが、私の推測では、あなたの例で返されたオブジェクトは開いているシェルブファイルであり、 isaのときにそのコンテンツにアクセスできなくなりました。これは、呼び出し以外のいくつかの理由で発生する可能性があります手動で。acloseda.close()

これを防ぐには、最初にすべてのデータを実際の辞書にコピーし、このデータをロードします。

mat_dict = {}
mat_dict.update(loadmat('file.mat'))

からすべてのキーと値を取得できるようになりましたmat_dict

a = mat_dict['juncForward_c']
print(a.shape) # should work now

mat_dict データが何であるかをテストして把握している限り、これは有効なソリューションであることに注意してください。スクリプト/モデル/関数では、通常、シェルブ dict の必要な部分のみをロードし、ファイルを明示的に閉じます。

f = loadmat('file.mat')
a = f['juncForward_c']
f.close()

with ステートメントが機能するかどうかはわかりません (shelve はまだサポートしていません)。テストする必要がありますが、ロード中に例外がスローされた場合でもクローズを処理する必要がありますa

with loadmat('file.mat') as f:
    a = f['juncForward_c']

編集:追加の属性を追加するための numpy 配列のサブクラス

import numpy as np

class MatArray(np.array):
    def __init__(self, filepath):
        f = loadmat(filepath)
        np.array.__init__(self, f['juncForward_c'])
        self.version = f['__version__']
        self.header = f['__header__']
        f.close() 

したがって、配列を matlab 構造に似せたい場合は、次のようにします。

>>> a = MatArray('myfile.mat')
>>> a.header
'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011'
>>> a.shape

于 2011-10-01T17:55:08.343 に答える
0

mat ファイルに整数または文字列のリストを含むセル配列しかない場合は、そのための汎用コードを作成しました。たとえば、matlab では次のようなことができます。

names = cell(1, N);
indices = cell(1, N);
for ind=1:N
    names{ind} = *some_value*;
    indices{ind} = *some_array*;
save('names_and_indices.mat', 'names', 'indices');

ここでは、Python でこのマット ファイルを読み取る方法を見つけることができます。

于 2016-02-18T17:25:45.507 に答える