2017-01-28 10 views
1

MATLABにコードが1つあり、そのコードをPythonに変換しようとしています。 MATLABでは、これを書くことができます:リニアインデックスを使用してPythonの2D配列にアクセスする方法

x = [1,2,3;4,5,6;7,8,9]; 

これは単なる3 * 3行列です。次にx(1:5)を使用すると、MATLABは最初に行列xを1 * 9ベクトルに転送してから、次のように1 * 5ベクトルを返します。ans=[1,4,7,2,5]; Pythonの単純なコードでは、同じ結果?

+0

新しい段落を見てお勧めします強いです1つの段落の末尾と次の段落の間の空白行。 2つの結果が返されます – user2386276

+1

MATLABの仕組みが正確ではありません。 'x(1:5)'は、列の主要な順序で最初の5つの要素を取ります。これは記述したように考えることができますが、MATLABは中間のステップを実行しません。 – Adriaan

+0

まず、新しい段落を生成する方法を教えてくれてありがとう。 Matlabのプロシージャを考えると、私はMatlabが返すものを記述しようとし、Pythonで同じ作業をするための正しい記述についての答えを得ることを望みます。まだあなたの意見のためにthx。 –

答えて

5

あなたは、あなたの元の行列へのインデックスに使用することができます添字にあなたの線形インデックスを変換するunravel_indexを使用し、その後numpy配列にあなたの行列を変換することができます。あなたのような行列を平らにしたい場合は、以下のすべてのコマンドは、むしろ

import numpy as np 

a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
inds = np.arange(5); 

result = a[np.unravel_index(inds, a.shape, 'F')] 
# array([1, 4, 7, 2, 5]) 

また、行優先順序(numpyのデフォルト)よりも列優先順序(MATLABのデフォルト)を使用する'F'入力を使用することに注意してくださいMATLABあなたにもそれを行うことができます。

a.flatten('F') 
# array([1, 4, 7, 2, 5, 8, 3, 6, 9]) 

あなたのpythonにMATLABコードの束を変換する場合、それはnumpyを使用して、ちびによって作成されthe documentation on notable differences

+0

本当にありがとうございます。あなたのコードは、私が持っている問題を完全に解決します。また、ドキュメントのためのthx。 –

1

MATLABのx(1:5)シンタックスでは、どのような構文が想定されているのかよくわかりませんが、希望する出力に応じて、マトリックスを転置して平坦化してスライスを戻しているようです。これは、Pythonでそれを行う方法です:

>>> from itertools import chain 
>>> 
>>> x = [[1,2,3], 
...  [4,5,6], 
...  [7,8,9]] 
>>> 
>>> list(chain(*zip(*x)))[0:5] 
[1, 4, 7, 2, 5] 
+0

私はMATLABが何をしているかをコメントしました。私。 'A = [1,2,3,4]' 'A(:)'が[1; 2; 3; 4]を返すならば。転置は必要ありません。あなたが「平坦化」と呼ぶことは、明らかにPythonがやっていることですが、これは同じ手順ですが行優先順位が高いため、行列を転置して列長にする必要があります。 – Adriaan

+0

あなたのコードは完全に質問に答えることができます!しかし、実際には、私が持っている問題はもっと複雑です。あなたの答えはまたthx! –

関連する問題