5

Python で Matlab セル配列を作成して .mat ファイルとして保存しようとしていますが、すべてのセルに 2 つの値が含まれていると問題が発生します。

import scipy.io as sio

twoValues = {'a': array([[array([[2, 2]]), array([[3, 3]])]])}
sio.savemat('test.mat',twoValues)

マトラブでは:

load('test.mat')
>>> a

a(:,:,1,1) =

           2           3


a(:,:,1,2) =

           2           3


>>> class(a)

ans =

int32

Python に戻ります。

threeValues = {'a': array([[array([[2, 2, 2]]), array([[3, 3]])]])}
sio.savemat('test.mat',threeValues)

マトラブでは:

>>> a

a = 

    [3x1 int32]    [2x1 int32]


>>> class(a)

ans =

cell

これの理由は何ですか?

4

1 に答える 1

13

これを行う場合:

a = np.array([[np.array([[2, 2]]), np.array([[3, 3]])]])

への最後の呼び出しは、np.array実際には内側の 2 つを連結するため、最後に 1 つの配列を取得します。

>>> a
array([[[[2, 2]],

        [[3, 3]]]])

>>> a.shape
(1, 2, 1, 2)

ただし、セル配列を模倣するには、基本的に配列の配列が必要です。を設定することでこれを実現できますがdtype=object、自動マージを回避するには、配列を作成して要素を個別に設定する必要があります。

three = array([[array([[2, 2, 2]]), array([[3, 3]])]])
two = np.empty(three.shape, dtype=object)
two[0,0,0] = np.array([[2,2]])
two[0,1,0] = np.array([[3,3]])

それで:

sio.savemat('two.mat', {'two': two})

それらがどのように見えるかを見るには:

>>> two
array([[[array([[2, 2]])],
        [array([[3, 3]])]]], dtype=object)

>>> two.shape
(1, 2, 1)

ネストされたブラケットが非常に多いため、希望する形状について混乱している可能性があることに注意してください。そのため、これらの一部を再形成する必要があるかもしれませんが、アイデアは関係なく保持されます。

于 2013-11-05T21:11:55.227 に答える