2012-04-16 4 views
2

3次元の行列をモデル化するためにPythonを使用するときは、まずゼロの複数配列を作成します。そして、各要素をそのインデックスを参照して簡単に上書きすることができます。問題は、[:]を使用して複数の要素を参照しようとすると、インデックスの順序が変わることです。行列の数学の専門用語で話すつもりだから、私と一緒に裸にしてください。Python配列のインデックススイッチ - 何が起こっているのですか?

以下の例では、2次元平面上のオブジェクトの位置を時間レベルでモデル化したいと考えています。だから、各レベルでは、私はX(行)とY(列)の座標を持っています。以下の例では、3行4列の2つの時間レベルを使用します。

>>> Simple = numpy.zeros([2,3,4],float) 
    >>> print Simple 
    [[[ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.]] 

    [[ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.]]] 

いいね。私は2つの3x4行列を持っています。今度は、2番目の行列(2番目の時間)、3行目、4列目の値を9に変更したいと考えています。

>>> Simple[1][2][3] = 9 
    >>> print Simple 
    [[[ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.]] 

    [[ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.] 
    [ 0. 0. 0. 9.]]] 

これまでのところよくできています。これから、指標の順序は単純[TimeLevel、X、Y]であることが分かります。だから今、各レベルで、私は最初の行、2番目の列(timelevel =両方、x = 0、y = 1)の要素を数字 "4"にします。

>>> Simple[:][0][1] = 4 
    >>> print Simple 
    [[[ 0. 0. 0. 0.] 
    [ 4. 4. 4. 4.] 
    [ 0. 0. 0. 0.]] 

    [[ 0. 0. 0. 0.] 
    [ 0. 0. 0. 0.] 
    [ 0. 0. 0. 9.]]] 

このように、インデックスの順序は同じではありません。 Simple [TimeLevel、row、column]からSimple [column、TimeLevel、row]に切り替えました。

私の質問は:なぜですか?

答えて

2

すべて[:]は、シーケンスのコピーを返します。これはあなたが望むものではありません。

>>> Simple[:,0,1] = 4 
>>> Simple 
array([[[ 0., 4., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]], 

     [[ 0., 4., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]]) 
+0

ありがとうございます!!!!!!!!! –

関連する問題