NumpyとPandasとaxisと

f:id:ts0818:20210123145504p:plain

www.itmedia.co.jp

 米Red Hatはこのほど、個人開発者向けに提供している「Red Hat Developerプログラム」を拡大し、個人開発者には無料で最大で16システムまで本番環境でも利用可能にすることを発表しました。

個人開発者はRed Hat Enterprise Linuxを無料で最大16システムまで利用可能に 本番環境もOK - ITmedia NEWS

 これは先月発表された、CentOS 8のサポートを2021年末までとし、今後はCentOS Streamの開発に注力することへの影響を考慮したもの。

個人開発者はRed Hat Enterprise Linuxを無料で最大16システムまで利用可能に 本番環境もOK - ITmedia NEWS

 現在のRed Hat Developerプログラムは個人開発者に対して1つのマシンでのみ無料でRed Hat Enterprise Linuxの利用を認めていました。

個人開発者はRed Hat Enterprise Linuxを無料で最大16システムまで利用可能に 本番環境もOK - ITmedia NEWS

 これが2月1日以降拡大され、個人開発者には本番環境を含む最大16システムまで無料でRed Hat Enterprise Linuxの利用が認められるようになります。

個人開発者はRed Hat Enterprise Linuxを無料で最大16システムまで利用可能に 本番環境もOK - ITmedia NEWS

⇧ な、何やてぇ~!? 

ありがたや~、Virtual Boxとかでmulticluster kubernetesの環境を作る際のOSを全部RHELRed Hat Enterprise Linux)にすることができそうじゃない?

(自分の場合、パソコンのメモリが8GMのため、Virtual Boxで同時に動かせる仮想マシンが3台ぐらいだけども...)

というわけで、今回もPython拡張ライブラリのPandasとかNumpyとかの話ですかね。

レッツトライ~。

 

そもそも、「axis」って何?

何て言うか、そもそも、「axis」って何?というか、Pythonにおいてはどこで定義されたものなのか?

調べた限りだと、Numpyの情報が検索の上位に来るから、Numpyが起源説が有効なんでしょうか?

Numpyの用語集には、

numpy.org

along an axis

Axes are defined for arrays with more than one dimension. A 2-dimensional array has two corresponding axes: the first running vertically downwards across rows (axis 0), and the second running horizontally across columns (axis 1).

Many operations can take place along one of these axes. For example, we can sum each row of an array, in which case we operate along columns, or axis 1:

https://numpy.org/doc/stable/glossary.html#glossary

⇧ ってあるので、Numpyで定義されてる「axis」を基準と考えていきましょうかね。

 

Numpyの「axis」って?

で、Numpyの「axis」 については、「1次元以上の配列のために定義された軸」だと、Numpyの用語集には記載されていたわけですと。

deepage.net

■2次元配列の「axis」

■3次元配列の「axis」

⇧ 上記サイト様が分かりやすいですが、Numpyの「axis」は配列の次元の一番高次元が基準になるということですかね。

 

 

Pandasの「axis」って?

で、同じくPython拡張ライブラリのPandasでも「axis」が出てきますと。

qiita.com

axis=0はそれぞれの列に対してだったり、それぞれの行ラベル(インデックス)に対してメソッドを適用する場合に用います。

axis=1はそれぞれの行だったり、列ラベル(列名)に対してメソッドを適用する場合に用います。

pandasのaxisの方向の覚え方 - Qiita

⇧ 上記サイト様によりますと、メソッドによって「axis」の設定を気をつけないといけないみたいね。

 

結局のところ、NumpyとPandasでメソッド実行時の「axis」の設定と挙動の違いは?

何か、モヤモヤしたのでね、実際どうなんだろう?ってことで検証してみたところ、「axis」の設定というよりは、データ構造の違いが影響してそうかなと。

まぁ、Pandasのpandas.DataFrameクラスのオブジェクトのデータ構造が独特ということもありますかね。

今回は2次元のデータで試してみました。

PandasのCheet Sheetにも、DataFrame オブジェクトがメインで紹介されていたので。

2021年1月24日(日)現在、PandasのAPI Referenceによるとpandas.DataFrame は、2次元のデータってことみたいです。

⇧ というか、Pandasって、pandas.DataFrame クラス以外にも様々なクラスがあるんですが、Pandasの公式のCheet SheetがどういうわけかDataFrame推しが凄まじい... 

で、脱線しましたが、NumpyとPandasで「axis」について調査した時のコードが以下。

■Numpyの「axis」調査

# Numpyのaxis考察
import numpy as np

# ■2次元配列の場合
# axis=0(行を指定)で合計
arr_2d_x = np.array([[0, 1], [2, 3], [4, 5]])
print("Numpyの2次元配列にsum()実施前(axis=0(行を指定)で合計):\n{}".format(arr_2d_x))
print("Numpyの2次元配列にsum()実施後(axis=0(行を指定)で合計):\n{}".format(arr_2d_x.sum(axis=0)))

# axis=1(列を指定)で合計
arr_2d_y = np.array([[0, 1], [2, 3], [4, 5]])
print("Numpyの2次元配列にsum()実施前(axis=1(列を指定)で合計):\n{}".format(arr_2d_y))
print("Numpyの2次元配列にsum()実施後(axis=1(列を指定)で合計):\n{}".format(arr_2d_y.sum(axis=1)))

■Pandasの「axis」調査

# Pandasのaxis考察
import numpy as np
import pandas as pd

# ■2次元データ
# axis=0(行を指定)で合計
df_2d_x = pd.DataFrame({0:[0, 1], 1:[2, 3], 2:[4, 5]})
print("Pandasの2次元データにsum()実施前(axis=0(行を指定)で合計):\n{}".format(df_2d_x))
print("Pandasの2次元データにsum()実施後(axis=0(行を指定)で合計):\n{}".format(df_2d_x.sum(axis=0)))

# axis=1(列を指定)で合計
df_2d_y = pd.DataFrame(np.array([[0, 1], [2, 3], [4, 5]]).T)
print("Pandasの2次元データにsum()実施前(axis=1(列を指定)で合計):\n{}".format(df_2d_y))
print("Pandasの2次元データにsum()実施後(axis=1(列を指定)で合計):\n{}".format(df_2d_y.sum(axis=1)))

f:id:ts0818:20210123111935p:plain

ってな感じで、pandas.DataFrameは、通常の2次元配列と異なり、「列」が縦向きになってるせいで、「axis」が通常の2次元配列と逆になるんですと。

pandas.DataFrameは、Oracle Database、MySQLMariaDBPostgreSQLSQLServer、などなどのRDBMS(Relational DataBase Management System)のテーブルみたいなデータ構造に近そうですかね。

 

axis=-1って?

Pythonで「-1」と言ったら? 

teratail.com

axis は N 次元配列の座標軸です。
concatenate レイヤーの axis は結合方向を指定するのに使用します。
axis=-1 とした場合は、一番最後の軸で結合します。
例えば、2次元配列の場合、axis=0,1 なので、axis=-1 は axis=1 を意味します。

Python - axis=-1の意味がわかりません(Python・Keras)|teratail

⇧ そうですね、一番最後の要素を指すんですね。 

 

NumpyとPandasの使い分けって?

「Numpy」と「Pandas」ってどう使い分けるものなのか? 

機械学習をする場合、元データが存在した場合には、それをまずはPandasのDataFrameに落とし込んで加工します。そして、DataFrame内の必要なデータをNumPyのndarrayに変換し、機械学習の演算や高度なアルゴリズムによる処理を行う、というのがよくある方法だと思います。

PandasとNumPyの違いと使い分け方 - DeepAge

機械学習や画像処理を含む高度なアルゴリズムはDataFrameではなく、ndarrayを引数にとることが多いです。NumPyに落とし込むのは最後の最後の段階で、NumPyが処理するのが得意な形に持っていくようPandasで色々前処理をする役割になることが多いです。

PandasとNumPyの違いと使い分け方 - DeepAge

データ分析では作業時間の5割以上は前処理に割くといっても過言ではありません。そう考えると、Pandasを使った処理を覚えておくと役立つ場面が多いでしょう。

PandasとNumPyの違いと使い分け方 - DeepAge

⇧ 上記サイト様によりますと、

  • Pandas
    データ前処理
  • Numpy
    データ分析

ってな使い分けになる感じですかね?

まぁ、NumpyのarrayとPandasのpandas.DataFrameで「axis」の設定を意識しないといけないということは分かりましたが、ハマりどころが多そうですな...

今回はこのへんで。