3

Pythonを使用して3次元行列をモデル化するときは、最初にゼロのマルチ配列を作成します。次に、インデックスを参照することで、各要素を簡単に上書きできます。問題は、[:]を使用して複数の要素を参照しようとすると、インデックスの順序が変わることです。行列数学の専門用語で話すので、我慢してください。

以下の例では、時間レベルごとに2D平面内のオブジェクトの位置をモデル化したいと思います。したがって、時間レベルごとに、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.]]]

ここまでは順調ですね。このことから、インデックスの順序はSimple [TimeLevel、X、Y]であることがわかります。したがって、ここで、各時間レベルについて、最初の行、2番目の列(時間レベル=両方、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]に切り替えました。

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

4

1 に答える 1

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.]]])
于 2012-04-16T00:35:46.530 に答える