scipy.io.loadmatを使用して、.matMatlabファイルからPythonで辞書キーを同じ値の変数名に変換します
質問
scipy.io.loadmatを使用して.matファイルからロードされた基本的な辞書temp= {'key':array([1,2])}を取得しようとしています。loadmat()によって返されたPython辞書ファイルのキーを、それを表すキーと同じ値を持つ変数名に変換します。
たとえば: ジェネラコディセタグプレ
になりました ジェネラコディセタグプレ
temp.keys()でキーを取得する方法を知っています。次に、アイテムを取得するのは簡単ですが、temp.keys()の文字列のリストを文字列ではなく変数名に強制するにはどうすればよいですか。
これが理にかなっていることを願っていますが、これはおそらく本当に簡単で、どうすればよいかわからないのです。
乾杯
解決
Pythonでは、メソッドパラメータを**
マジックを使用して辞書として渡すことができます:
ジェネラコディセタグプレ
他のヒント
最善の方法は、temp['key']
を使用することです。ただし、質問に答えるには、exec
関数を使用できます。この方法の利点は、変数名をハードコーディングしたり、関数内で作業するように制限したりする必要がないことです。
ジェネラコディセタグプレ
注:これは、モジュールから特定の関数をインポートした場合にのみ機能します。コードの練習やインポートする必要のある関数の量が非常に多いためにこれを実行したくない場合は、エントリの前にモジュール名を連結する関数を作成できます。出力は前の例と同じです。 ジェネラコディセタグプレ
これは最良のコードプラクティスではありませんが、テストしたすべての例でうまく機能します。
より良い方法は、データを別のオブジェクトに詰め込むことです。 ジェネラコディセタグプレ
これはインタラクティブに使用するのとほぼ同じくらい簡単で、魔法を必要としません。 これはMatlabユーザーにとっても問題ないはずです。
編集:以下のものは実際にはほとんどの場合機能しないことがわかりました。ひどい、魔法には多すぎる。
ただし、魔法をいじりたい場合は、次のようなことができます ジェネラコディセタグプレ
これはインタラクティブに正常に機能し、locals()
をいじることで、ローダー関数内のsys._getframe().f_back.f_locals
へのアクセスを非表示にすることもできます。
ただし、これは関数では機能しません: ジェネラコディセタグプレ
重要なのは、上記のa
はコンパイル時にグローバル変数にバインドされるため、Pythonはローカル変数の中からそれを検索しようとしないということです。
辞書を直接使用して、temp['key']
のような配列にアクセスすることをお勧めしますが、事前にすべての変数名を知っていれば、それらを個々の変数に抽出する関数を作成できます。
ジェネラコディセタグプレ