2017-05-03 9 views
0

Matlabから来る私は単数のデータポイント/変数について考えることさえできません。私が扱うものはすべて行列/配列です。 1週間の検索と徹底的な試行錯誤の後、私は(普通の)Pythonで行列を扱うという概念は絶対に得られません。私は2つの次元に沿ってマトリックス内のベクトルを抽出しようとするとPythonとベクトルと行列のリストMatlabのベクトルと行列

In[]: A = [[1,2,3], [9,8,7], [5,5,5]] 
In[]: A 
Out[]: [[1, 2, 3], [9, 8, 7], [5, 5, 5]] 

を作成

In[]: A[:][1] 
Out[]: [9, 8, 7] 
In[]: A[1][:] 
Out[]: [9, 8, 7] 

は '驚くほど' と同じになります!特定の列を取得する方法はありません(もちろん、1回の反復を除いて)。

したがって、別のベクトルで行列Aをマージすることはできません。つまり、別の列でAを拡張することはできません。 Matlabのスタイルのアプローチは明らかに奇妙です:

In[]: B = A, [4,6,8] 
In[]: B 
Out[]: ([[1, 2, 3], [9, 8, 7], [5, 5, 5]], [4, 6, 8]) 

何かにネストでの結果ではなく、

B = [A, [4,6,8]] 

[OK]を、より多くのPythonなどのための同じA. の拡張子:

A.append([11,12,13]) 

この簡単に行を追加します。しかし、列を追加する同様の方法はありますか?

(イライラする事はPythonのドキュメントは、空想の例のすべての種類が、どうやら1次元リストの実証 "神託のソリューションでこれらのフォーカスを与えることである。)MATLAB自分から来る

+3

Raw Pythonは行列代数を考慮して設計されていません。あなたはnumpyのライブラリを調べるべきです。 –

+2

まあ、あなたは無作為にpythonのリストでmatlabの行列から概念を投げることはできません、彼らは全く異なるデータ構造です。この質問はPythonのチュートリアルを読む必要があるので、私たちが提供できるよりも多くの助けが必要です。あなたはそれを調べていると言いますが、何が起きているのかはっきりと分かりません。だからそれをもう一度読んで、先のmatlabの知識を破棄してください。特定の(!)スライシングやインデックス作成に問題が発生したときに戻ってきてください。それ以外にも、matlabのような振る舞いが必要な場合は、Pythonリストではなく、numpyの配列と行列を使用してください。 – timgeb

+0

最初のステップとして、Pythonリストを一連のオブジェクトとして考えてください。 「列」の概念はリストには適用されないため、「列」を追加するための組み込みメソッドはありません。あなたがリストのリストを持っているとき、列はあなたの頭の中だけにあります。 Pythonの場合、リストオブジェクトの1次元のシーケンスです。リストは一般的な行列演算を行うようには設計されていません。 – timgeb

答えて

6

、私はあなたのポイントを理解しています。 問題は、Pythonリストが行列として機能しないことです。リストにインデックスを付けるときは、常にトップレベルのリスト要素で作業します。 A[:][1]は、[1, 2, 3],[9, 8, 7]および[5, 5, 5]の3つのリスト要素([:])をすべて返します。次に、2番目の要素([1])、つまり[9, 8, 7]を選択します。 A[1][:]は同じ、まったく逆の動作をします。

これは、A[1][1]が期待した結果(8)を示すので、単純なインデックス作成タスクにはまだnested listsを使用できます。しかし、MATLABコード全体をPythonに移行しようとする場合や、行列の問題ではない場合は、NumPyの使用を検討する必要があります。さらにNumPy guide for former MATLAB usersがあります。

関連する問題