2016-06-23 1 views
6

私はscipyのloadmat関数を使ってPythonにmatlabのデータファイルを読み込みます。numpy ndarrayの要素にアクセスするには?

from scipy.io import loadmat 

data = loadmat('data.mat') 
fields = data['field'] 

fieldsのタイプnumpy.ndarrayある:

print 'fields type={}'.format(type(fields)) 
print 'fields dtype={}'.format(fields.dtype) 
print 'fields shape={}'.format(fields.shape) 
fields type=<type 'numpy.ndarray'> 
fields dtype=object 
fields shape=(5,) 

Iはnditerを使用してアレイを反復処理:

for x in np.nditer(fields, flags=['refs_ok']): 
    print 'x={}'.format(x) 
    print 'x type={}'.format(type(x)) 
    print 'x dtype={}'.format(x.dtype) 
    print 'x shape={}'.format(x.shape) 
    break 
x=[u'ACE'] 
x type=<type 'numpy.ndarray'> 
x dtype=object 
x shape=() 

はIndexError:私はxの最初の要素にアクセスしようとした場合

私はIndexErrorを得る:

x[0] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-102-8c374ae22096> in <module>() 
    17  print 'type={}'.format(type(x)) 
    18  print 'dtype={}'.format(x.dtype) 
---> 19  x[0] 
    20  break 
    21 

IndexError: too many indices for array 

質問:

  • どうして、type(x)戻り場合nump.ndarrayそれは "配列のためのインデックスが多すぎる"と言いますか?
  • xの内容を文字列に抽出するにはどうすればよいですか?

はここで私が使用しているバージョンです:

print 'python version: {}'.format(sys.version) 
print 'numpy version: {}'.format(numpy.__version__) 
print 'scipy version: {}'.format(scipy.__version__) 
python version: 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] 
numpy version: 1.11.0 
scipy version: 0.17.1 
+0

'x.shape'を印刷できますか? –

+0

@C_Z_ - '()'を返す 'x.shape'を含むように質問を更新しました –

+1

これは0dの配列です。これは0要素のタプル' x [()] 'でインデックスを付ける必要があります。私の答えを見てください。 – hpaulj

答えて

6

詳細にあなたのエラーを見ていなければ、私はいくつかの落とし穴を指摘することができます。

.matには、MATLAB行列(常に2d以上)、セル、構造体が含まれます。

loadmatは、さまざまな方法でレンダリングされます。あなたは名前で索引付けしなければならない辞書があります。オブジェクト配列(dtype = object)があります。また、数値配列や文字列配列があります。数値配列を取得するには、いくつかのレベルで作業する必要があります。

アレイの '形状'(サイズ)とその 'dtype'を確認してください。形状が()dtypeのオブジェクトの場合は、y=x[()]で抽出します。ここ

は、0Dオブジェクト配列の例は次のとおり

In [4]: y=np.arange(3) 

In [5]: x=np.empty((), dtype=object)  
In [6]: x[()]=y 

In [7]: x 
Out[7]: array(array([0, 1, 2]), dtype=object) 

In [8]: x.shape 
Out[8]:() 

In [9]: x.dtype 
Out[9]: dtype('O') 

In [10]: x[0] 
... 
IndexError: too many indices for array 

In [11]: x[()] 
Out[11]: array([0, 1, 2]) 

xは0D配列(x.ndim)であるので、0要素タプル、()で索引付けされなければなりません。奇妙に思えるMATLABプログラマにとって。

numpy(一般的なPython)では、x[a,b,c]x[(a,b,c)]ind=(a,b,c); x[ind]と同じです。言い換えると、[]の引数は値の組であると理解されます。(1,2)は2要素タプルであり、(1,)は1要素です((1)は単なるグループ化です)。()は0要素タプルです。したがってx[()]は、通常のndインデックス表記法の拡張です。特別なケースではありません。

+0

ありがとうございました、その配列インデックス表記法( 'x [()]')を使っていただきありがとうございます。私はその表記法を読むことができるリソースを持っていますか?私はかつてそれを見たことがない。 –

+1

私はこの表記法の段落を追加しました。 – hpaulj

+0

説明をいただきありがとうございます! –

関連する問題