Axis 引数を使用して Python で NumPy 配列を操作する

Salman Mehmood 2023年6月20日
Axis 引数を使用して Python で NumPy 配列を操作する

この記事では、NumPy の axis 引数を操作する方法と、NumPy で軸が何であるかを確認する方法について説明します。 また、Python で NumPy 配列をすばやく操作するための強力な操作として axis 引数を使用する方法も学びます。

axis 引数を使用して Python で NumPy 配列を操作する

実証するために、操作するデータが必要ですが、大きすぎたり複雑すぎたりするデータは必要ありません。 それが、私たちが非常に頻繁に行うことを行った理由です。 NumPy について何かを学んでいるとき、最初に出てくるのは配列と呼ばれるものなので、この場合は配列をテストするために既に作成しています。

import numpy as np

Temperature_Array = np.array(
    [
        [[26, 25, 24], [24, 25, 26]],
        [[27, 25, 23], [25, 28, 24]],
        [[27, 24, 26], [24, 27, 25]],
        [[27, 26, 24], [28, 25, 26]],
    ]
)

Timeseries_Temperature = np.array(
    [[23, 24, 25, 24, 23, 25], [25, 26, 27, 29, 25, 23], [20, 23, 21, 22, 25, 29]]
)

最初のテスト配列 Temperature_Array は、グリッド化された予測を表すことになっています。 グリッド観測があり、2 行 3 列に配置された 6つのステーションで 4 時間ステップをエミュレートしようとしているとします。

次のサブ配列は最初の時間ステップなどになります。

[[26, 25, 24], [24, 25, 26]]

これらの軸ごとに異なる数の要素を作成し、4つの時間ステップと 3つの列、または各行に 3つのステーションと時間ステップごとに 2つの行があることに気付くでしょう。

NumPy で何かを試す際によくある間違いは、3x3 配列または 3x3x3 配列を作成することです。何が起こっているのか知っていると思いますが、実際に試してみるとうまくいきません。

これは、実際のデータにはこれらの異なる方向に異なる数の要素があり、スライスや何をしようとしているのかがわからなかったためです。

Timeseries_Temperature と呼ばれる 2 番目は、より単純です。 これは、1 時間ごとに温度を観測し、6 時間ある 3つの観測所を表しています。

行は駅、列は時間です。

5 次元の配列がある場合、行、列、および深さが時間になる可能性がありますが、これらの次元は配列の軸です。 軸は、この NumPy 配列の個々の部分です。 それを通り抜ける方向です。

Timeseries_Temperature を見て、配列の次元数である ndim 属性を使用してその次元を取得してみましょう。

Timeseries_Temperature.ndim

出力:

2

最小値に関する情報を取得したいとしましょう。 次に、次のようなことを行います。

Timeseries_Temperature.min()

20 は実際にはこの配列の最小値であるため、20 が返されますが、これはおそらく私たちが望んでいるものではありません。 データ内の任意の時点でどのステーションが最低気温を経験したかを知りたいです。また、各ステーションが経験した最低気温を知りたい場合もあります。

または、各時間の最低気温と、その 6 時間で最も寒かった場所を知りたい場合もあります。 ここで axis 引数が登場し、大いに役立ちます。

ループを行う必要はなく、手動でスライスする必要もありません。

しかし、それを理解するために、ここでいくつかのスライスを作りましょう。

Timeseries_Temperature[0, :]

0 番目の次元または 0 番目の軸の 0 番目の要素を取得して、最初の行を取得します。

array([23, 24, 25, 24, 23, 25])

すべてを与えると言うとどうなるか見てみましょう。コロンは 0 番目の軸に沿って示し、1 軸に沿って 0 番目の項目を示します。

Timeseries_Temperature[:, 0]

これにより、0 番目の列とすべての行が得られます。

array([23, 25, 20])

Timeseries_Temperature を再び使用して、min() 関数を呼び出しましょう。 shift + tab を押すと、axis 引数があり、デフォルトでは None であることがわかります。

今度は axis が 0 に等しいことを渡します。

Timeseries_Temperature.min(axis=0)

これにより、配列内の最小値が得られますが、個々の要素が得られます。

array([20, 23, 21, 22, 23, 23])

どちらの場合も同じ形状でしたが、スライスを使用する代わりに、axis 引数を使用しました。これは、1 時間ごとの観測所の列方向の最低気温です。

次に、列として表される軸 1 を折りたたみ、それぞれの最小時間を取得します。

Timeseries_Temperature.min(axis=1)

出力:

array([23, 23, 20])

次に、より複雑なケースを見てみましょう。そのため、Temperature_Array を再度出力して、それがどのように見えるかを示します。

Temperature_Array

出力:

array([[[26, 25, 24],
        [24, 25, 26]],

       [[27, 25, 23],
        [25, 28, 24]],

       [[27, 24, 26],
        [24, 27, 25]],

       [[27, 26, 24],
        [28, 25, 26]]])

Temperature_Array には、行、列、深さの 3つの次元があります。 Temperature_Array[0,:,:] と入力すると、最初のブロックが取得されます。この場合、0 番目の軸は時間ステップを表し、各角括弧は実質的に軸です。

array([[26, 25, 24],
       [24, 25, 26]])

今回は、最小値を使用する代わりに、mean() 関数を使用して Temperature_Array のいくつかの手段を取ります。

Temperature_Array.mean()

出力:

25.458333333333332

ここで、0 に等しい軸を使用します。これは、時間ステップの最も外側の角括弧のセットである 0 番目の軸を折りたたむことを意味します。

Temperature_Array.mean(axis=0)

Temperature_Array からの時間ステップの全体的な平均である 2 行と 3 列の配列を取得しました。

array([[26.75, 25.  , 24.25],
       [25.25, 26.25, 25.25]])

データの配置が異なる場合は、別の軸を使用する必要がある場合があります。 この場合、axis = 1 を使用します。

Temperature_Array.mean(axis=1)

ここでは、列のすべての時間ステップで平均を取得している理由である行番号を折りたたんでいます。

array([[25. , 25. , 25. ],
       [26. , 26.5, 23.5],
       [25.5, 25.5, 25.5],
       [27.5, 25.5, 25. ]])

axis 引数に 2 を渡し、axis が 2 に等しいことを使用して、列で表される最も内側の次元を折りたたみます。 これは、各タイム ステップまたは 4x2 配列での行単位の平均です。

Temperature_Array.mean(axis=2)

出力:

array([[25.        , 25.        ],
       [25.        , 25.66666667],
       [25.66666667, 25.33333333],
       [25.66666667, 26.33333333]])

完全なコード:

# In[1]:

import numpy as np

Temperature_Array = np.array(
    [
        [[26, 25, 24], [24, 25, 26]],
        [[27, 25, 23], [25, 28, 24]],
        [[27, 24, 26], [24, 27, 25]],
        [[27, 26, 24], [28, 25, 26]],
    ]
)

Timeseries_Temperature = np.array(
    [[23, 24, 25, 24, 23, 25], [25, 26, 27, 29, 25, 23], [20, 23, 21, 22, 25, 29]]
)


# In[2]:

Timeseries_Temperature.ndim

# In[3]:

Timeseries_Temperature.min()

# In[4]:

Timeseries_Temperature[0, :]

# In[5]:

Timeseries_Temperature[:, 0]

# In[6]:

Timeseries_Temperature.min(axis=0)

# In[7]:

Timeseries_Temperature.min(axis=1)

# In[8]:

Temperature_Array

# In[9]:

Temperature_Array.ndim

# In[10]:

Temperature_Array[0, :, :]

# In[11]:

Temperature_Array.mean()

# In[12]:

Temperature_Array.mean(axis=0)

# In[13]:

Temperature_Array.mean(axis=1)

# In[14]:

Temperature_Array.mean(axis=2)
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn