Numpy:Axisの理解

  • 軸は配列レベルです
  • axis = iを設定すると、Numpyはi番目の添え字の変更方向に沿って動作します
  • Axisアプリケーション

 

軸は配列レベルです

軸を理解するには、まず「Numpyの配列の次元」と「線形代数の行列の次元」の2つの概念と、それらの間の関係を理解する必要があります。数学または物理学の概念では、次元は空間内の点を表すために必要な座標の最小数と見なされますが、Numpyでは、次元は配列の次元を指します。たとえば、次の例:

>>> import numpy as np
>>> a = np.array([[1,2,3],[2,3,4],[3,4,9]])
>>> a
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 9]])

この配列の次元はわずか2です。つまり、axis = 0とaxis = 1の2つの軸軸があります。次の図に示すように、2次元配列の0次元(axis = 0)には3つの要素があります(左の図)。つまり、axis = 0軸の長さは3で、1次元(axis = 1)です。 )にも3つの要素(右)があります。つまり、axis = 1の長さは3です。それは、axis = 0とaxis = 1の長さが3であり、行列が水平方向と垂直方向に3つの数値を持っているためです。したがって、行列は線形代数で3次元です(ランクランクは3です)。

したがって、axisは配列レベルです。

axis = 0の場合、軸上に3つの要素があります(配列のサイズは3です)

a[0]a[1]a[2]

axis = 1の場合、軸上に3つの要素があります(配列のサイズは3です)

a[0][0]a[0][1]a[0][2]

(あるいはa[1][0]a[1][1]a[1][2]

(あるいはa[2][0]a[2][1]a[2][2]

 

別の例は、形状が(3,2,4)である次の配列です。

>>> b = np.array([[[1,2,3,4],[1,3,4,5]],[[2,4,7,5],[8,4,3,5]],[[2,5,7,3],[1,5,3,7]]])
>>> b
array([[[1, 2, 3, 4],
        [1, 3, 4, 5]],

       [[2, 4, 7, 5],
        [8, 4, 3, 5]],

       [[2, 5, 7, 3],
        [1, 5, 3, 7]]])
>>> b.shape
(3, 2, 4)

この形状(タプルで示される)は、各軸のサイズ、つまり占有される長さとして理解できます。理解を深めるために、一時的に複数の軸を複数のレイヤーとして想像することができます。axis = 0は最初のレイヤー(下図の黒いボックス)を意味し、このレイヤーの配列のサイズは3で、対応する軸の長さ= 3の要素です。axis= 1は2番目のレイヤー(赤いボックス)を意味します。下の図では)、このレイヤーの配列サイズは2で、軸上の要素の長さ= 2に対応します。axis= 2は3番目のレイヤー(下の図の青いボックス)を意味し、要素の長さは=対応する軸上で4。

 

 

axis = iを設定すると、Numpyはi番目の添え字の変更方向に沿って動作します

1. 2次元配列の例:

たとえばnp.sum(a, axis=1)、次の配列a[0][0]= 1、a[0][1]= 2、a[0][2]= 3と組み合わせると、 添え字が変化する方向が配列の最初の次元になります。

下付き文字が変更される方向に移動し、要素を合計して最終結果を取得します。

[
  [6],
  [9],
  [16]
]

 

2. 3次元配列の例:

別の例を挙げると、たとえば、次のnp.shape(a)=(3,2,4)3次元配列の場合、配列の0番目の次元の長さは3(黒いボックス)、1番目の次元の長さは2(赤いボックス)、そして最初の次元は2(赤いボックス)です。2次元の長さは4(青いボックス)です。

を計算するnp.sum(a, axis=1)場合は、最初のブラックボックスで、

下付き文字の方向の変更は次のとおりです。

したがって、2つの赤いボックスを上下に追加する必要があります

 

同じロジックに従って2番目と3番目のブラックボックスを処理することにより、最終結果を得ることができます。

したがって、それはまだ前に要約した文であり、axis = iを設定すると、Numpyはi番目の添え字の変更の方向に沿って動作します。

 

3. 4次元配列の例:

たとえば、次の巨大で複雑な4次元配列は

>>> data = np.random.randint(0, 5, [4,3,2,3])
>>> data
array([[[[4, 1, 0],
         [4, 3, 0]],
        [[1, 2, 4],
         [2, 2, 3]],
        [[4, 3, 3],
         [4, 2, 3]]],

       [[[4, 0, 1],
         [1, 1, 1]],
        [[0, 1, 0],
         [0, 4, 1]],
        [[1, 3, 0],
         [0, 3, 0]]],

       [[[3, 3, 4],
         [0, 1, 0]],
        [[1, 2, 3],
         [4, 0, 4]],
        [[1, 4, 1],
         [1, 3, 2]]],

       [[[0, 1, 1],
         [2, 4, 3]],
        [[4, 1, 4],
         [1, 4, 1]],
        [[0, 1, 0],
         [2, 4, 3]]]])

axis = 0の場合、numpyは0次元に沿って合計されます。つまり、最初の要素の値= a0000 + a1000 + a2000 + a3000 = 11、2番目の要素の値= a0001 + a1001 + a2001 + a3001 = 5同様に、最終結果は次のとおりです。

>>> data.sum(axis=0)
array([[[11,  5,  6],
        [ 7,  9,  4]],

       [[ 6,  6, 11],
        [ 7, 10,  9]],

       [[ 6, 11,  4],
        [ 7, 12,  8]]])

axis = 3の場合、numpyは3番目の次元に沿って合計されます。つまり、最初の要素の値= a0000 + a0001 + a0002 = 5、2番目の要素の値= a0010 + a0011 + a0012 = 7の場合、同じことが最終結果にも当てはまります。以下のとおりであります:

>>> data.sum(axis=3)
array([[[ 5,  7],
        [ 7,  7],
        [10,  9]],

       [[ 5,  3],
        [ 1,  5],
        [ 4,  3]],

       [[10,  1],
        [ 6,  8],
        [ 6,  6]],

       [[ 2,  9],
        [ 9,  6],
        [ 1,  9]]])

 

Axisアプリケーション

たとえば、4人のクラスメートが3つの果物への愛情についてリンゴ、ドリアン、スイカを評価したデータ(合計スコア10)を収集しました。各クラスメートには、次の3つの特徴があります。

>>> item = np.array([[1,4,8],[2,3,5],[2,5,1],[1,10,7]])
>>> item
array([[1, 4, 8],
       [2, 3, 5],
       [2, 5, 1],
       [1, 10, 7]])

各行には、同じ人物の3つの特徴が含まれています。どのクラスメートが果物を食べるのが好きかを確認したい場合は、次を使用できます。

>>> item.sum(axis = 1)
array([13, 10,  8, 18])

クラスメート4が果物を最も食べるのが好きであることがおそらくわかるでしょう。

どの果物が最も人気があるかを知りたい場合は、次を使用できます。

>>> item.sum(axis = 0)
array([ 6, 22, 21])

ドリアンが基本的に最も人気があることがわかります。

おすすめ

転載: blog.csdn.net/weixin_40244676/article/details/102977029