44

NumPy配列をMatlabに渡す方法を探しています。

を使用して配列を画像に格納し、を使用してscipy.misc.imsaveロードすることでこれを行うことができましたimreadが、これにより、もちろん、行列には​​「実際の」値ではなく0〜256の値が含まれます。

この行列を256で割った値と、元のNumPy配列の最大値をとると、正しい行列が得られますが、これは少し面倒だと思います。

もっと簡単な方法はありますか?

4

9 に答える 9

59

確かに、使用するだけですscipy.io.savemat

例として:

import numpy as np
import scipy.io

x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)

scipy.io.savemat('test.mat', dict(x=x, y=y))

同様に、がありscipy.io.loadmatます。

次に、これを。を使用してmatlabにロードしload testます。

または、@ JABが提案したように、ASCIIタブで区切られたファイル(例numpy.savetxt)に保存することもできます。ただし、このルートを使用すると、2次元に制限されます。一方、ASCIIはユニバーサル交換フォーマットです。ほとんどすべてのものが、区切られたテキストファイルを処理します。

于 2012-06-12T13:07:06.980 に答える
11

ファイルや外部ライブラリでデータを渡さないシンプルなソリューション。

Numpyには、ndarrayをリストに変換するメソッドがあり、matlabデータ型はリストから定義できます。したがって、いつ次のように変換できますか?

np_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mat_a = matlab.double(np_a.tolist())

matlabからpythonへはもっと注意が必要です。タイプを直接リストに変換する組み込み関数はありません。しかし、整形されていないがプレーンな生データにアクセスすることはできます。したがって、reshape(正しくフォーマットするtransposeために)と(MATLABとnumpyがデータを格納する方法が異なるため)を使用します。これは強調することが非常に重要です。主に2次元を超える行列を使用している場合は、プロジェクトでテストしてください。これは、MATLAB2015aおよび2つのdimで機能します。

np_a = np.array(mat_a._data.tolist())
np_a = np_a.reshape(mat_a.size).transpose()
于 2015-05-27T19:35:50.617 に答える
6

これは、Pythonでの反復や、ファイルIOの使用を回避するソリューションです-(醜い)matlab内部に依存することを犠牲にして:

import matlab
# This is actually `matlab._internal`, but matlab/__init__.py
# mangles the path making it appear as `_internal`.
# Importing it under a different name would be a bad idea.
from _internal.mlarray_utils import _get_strides, _get_mlsize

def _wrapper__init__(self, arr):
    assert arr.dtype == type(self)._numpy_type
    self._python_type = type(arr.dtype.type().item())
    self._is_complex = np.issubdtype(arr.dtype, np.complexfloating)
    self._size = _get_mlsize(arr.shape)
    self._strides = _get_strides(self._size)[:-1]
    self._start = 0

    if self._is_complex:
        self._real = arr.real.ravel(order='F')
        self._imag = arr.imag.ravel(order='F')
    else:
        self._data = arr.ravel(order='F')

_wrappers = {}
def _define_wrapper(matlab_type, numpy_type):
    t = type(matlab_type.__name__, (matlab_type,), dict(
        __init__=_wrapper__init__,
        _numpy_type=numpy_type
    ))
    # this tricks matlab into accepting our new type
    t.__module__ = matlab_type.__module__
    _wrappers[numpy_type] = t

_define_wrapper(matlab.double, np.double)
_define_wrapper(matlab.single, np.single)
_define_wrapper(matlab.uint8, np.uint8)
_define_wrapper(matlab.int8, np.int8)
_define_wrapper(matlab.uint16, np.uint16)
_define_wrapper(matlab.int16, np.int16)
_define_wrapper(matlab.uint32, np.uint32)
_define_wrapper(matlab.int32, np.int32)
_define_wrapper(matlab.uint64, np.uint64)
_define_wrapper(matlab.int64, np.int64)
_define_wrapper(matlab.logical, np.bool_)

def as_matlab(arr):
    try:
        cls = _wrappers[arr.dtype.type]
    except KeyError:
        raise TypeError("Unsupported data type")
    return cls(arr)

ここに到達するために必要な観察は次のとおりです。

  • Matlabは、タイプを理解しているかどうかをtype(x).__name__確認するだけのようです。type(x).__module__
  • ._dataインデックス可能なオブジェクトは属性に配置できるようです

残念ながら、matlabは_data内部で属性を効率的に使用しておらず、pythonプロトコルを使用するのではなく、一度に1つの項目を繰り返し処理していmemoryviewます:(。したがって、このアプローチでは速度の向上はわずかです。

于 2019-11-05T17:43:19.127 に答える
4

scipy.io.savematまたはscipy.io.loadmatは、matlabアレイ--v7.3では機能しません。しかし、良い部分は、matlab--v7.3ファイルがhdf5データセットであるということです。したがって、numpyを含む多くのツールを使用して読み取ることができます。

Pythonの場合、システムにHDF5が必要なh5py拡張機能が必要になります。

import numpy as np, h5py 
f = h5py.File('somefile.mat','r') 
data = f.get('data/variable1') 
data = np.array(data) # For converting to numpy array
于 2013-10-12T00:25:06.847 に答える
2

しばらく前に私は同じ問題に直面し、インタラクティブセッションから配列を簡単にコピーして貼り付けることができるように次のスクリプトを作成しました。明らかに小さな配列に対してのみ実用的ですが、毎回ファイルを保存/ロードするよりも便利であることがわかりました。

Matlab-> Python

Python-> Matlab

于 2012-06-13T11:28:00.707 に答える
2

「より単純」と見なされるかどうかはわかりませんが、matlabによって非常に高速に呼び出されるpythonスクリプトで作成されたnumpyarrrayからデータを移動するための解決策を見つけました。

dump_reader.py(Pythonソース):

import numpy

def matlab_test2():
    np_a    = numpy.random.uniform(low = 0.0, high = 30000.0, size = (1000,1000))
    return np_a

dump_read.m(matlabスクリプト):

clear classes
mod = py.importlib.import_module('dump_reader');
py.importlib.reload(mod);

if count(py.sys.path,'') == 0
    insert(py.sys.path,int32(0),'');
end

tic
A = py.dump_reader.matlab_test2();
toc
shape = cellfun(@int64,cell(A.shape));
ls = py.array.array('d',A.flatten('F').tolist());
p = double(ls);
toc
C = reshape(p,shape);
toc

これは、matlabsdoubleがセル/マトリックスと比較してアレイ上で効率的に機能しているように見えるという事実に依存しています。2番目のトリックは、効率的な方法でデータをmatlabs doubleに渡すことです(pythonsネイティブarray.arrayを介して)。

PSネクロポスティングについて申し訳ありませんが、私はそれで多くの苦労をしました、そしてこのトピックは最も近いヒットの1つでした。多分それは誰かが苦労する時間を短縮するのに役立ちます。

Matlab R2016b + python 3.5.4(64ビット)でテストされたPPS

于 2018-04-06T22:55:11.847 に答える
2

PythonライブラリDarrを使用すると、Python numpy配列を、バイナリファイルとテキストファイルのみで構成される自己文書化された広く読み取り可能な形式で保存できます。配列を保存すると、Matlabを含むさまざまな言語でその配列を読み取るためのコードが含まれます。つまり、本質的には、Pythonでnumpy配列をディスクに保存し、README.txtからコードをコピーして貼り付けてMatlabにロードするのは1行だけです。

開示:私は図書館を書きました。

于 2021-07-19T14:00:35.370 に答える
0

形状(5,365,10)を持つnp配列に保存された5年間の形状(365,10)の2D日次データがあるとしますnp3Darrat。Pythonで、np配列を保存します。

import scipy.io as sio     #SciPy module to load and save mat-files
m['np3Darray']=np3Darray   #shape(5,365,10)
sio.savemat('file.mat',m)  #Save np 3D array 

次に、MATLABでnp3D配列をMATLAB3Dmatixに変換します。

load('file.mat','np3Darray')
M3D=permute(np3Darray, [2 3 1]);   %Convert numpy array with shape (5,365,10) to MATLAB matrix with shape (365,10,5)
于 2021-05-02T18:22:24.667 に答える
0

最新のR2021aでは、python numpy ndarrayをdouble()に渡すことができ、コンソールでnumpy配列を呼び出した場合でも、下部に「double関数を使用してMATLAB配列に変換する」と表示されます。

于 2021-09-18T04:10:09.480 に答える