プログラミング言語では、
■ 変数
■ 処理
によって構成されているので、処理を行うためのデータを変数に格納して処理を用いることで必要な挙動を実装するkとになりますが、変数には
■ 単体の値
■ 複数の値
を格納できるものがあります。Pythonの場合、
■ リスト
■ タプル
■ 辞書
がありますが、辞書はインデックスと名前を組み合わせて格納できるものになっています。リストは配列なので、書き換え可能なものになっていますが、タプルは書き換え不可能な仕様になっているので、値を固定できると言う特徴があります。
元から存在している仕様はそうなっていますが、現在の変数の仕様中には、高校の数学で使用する集合と同じような数の集まりの表記があります。これを使用するとタプルのように変更不能な状態で値を扱うことが出来るようになっています。
単体の変数でデータを扱おうとすると管理が難しくなるので、通常は、配列を使った管理を行うことになりますが、Pythonの場合だと、
■ pandas
■ Numpy
などを使うことになると思いますが、組み込み関数で配列が使用できるので、小規模なもので速度を求めない場合だとはリストでの制御をしてもそれほど影響がでないと思います。
Pythonでは配列が用意されているので、数値の集まりを使うことが出来るのですが、この構造は、数列や集合だけでなく、【 帳票 】 と同じなので、スプレッドシートと同じ管理が出来ます。
そこで、今回は、配列を使ったデータの管理について書こうかなと思います。
データと数学
こうした考え方は、高校の数学で登場しますが、データには状態が存在するので、対象物の特徴として存在している変数の数分だけ次元数が増加します。この時の多変数の構造で推移を示す時に使用するのが多変数関数になりますが、この構造を座標軸で扱うようにしたものが幾何ベクトルになります。
高校の数学Cでは
■ 平面
■ 立体空間
におけるベクトルの制御の方法を扱っていますが、この構造はPCで動作しているベクターグラフィックの基礎知識なので、数学の知識を得た状態でCG検定の本に目を通してみると、高校で学習した数学や物理の公式が登場刷ると思います。
高校の数学では、座標制御に関しては様々なアプローチが行われていますが、数学Cについては、データの取り扱いとベクトルの制御について学習するので、
■ 幾何ベクトルの制御
■ 数ベクトルの下地作り
のような内容になっています。現在のカリキュラムでは行列も登場しますが、行列を使った座標制御が線形代数なので、これを数値で調整すると、
■ 移動
■ 拡大縮小
が行えますが、三角関数を代入して処理を行うと座標の回転を扱うことが出来るようになります。このように行列の中に三角関数を代入して回転を制御する方法として回転行列というものが存在していますが、これも大学の数学のカリキュラムで登場するものになります。
これは、高校で学習する
■ 行列
■ 三角関数
を組み合わせたものになりますが、基本的に学校で学習しているカリキュラムの内容は 【 部品の使い方と仕様書 】 ですから、電気工作の部品を購入してきた時の
■ データシート
■ 取扱説明書
のようなものになります。つまり、対象物を学習した後にその部品の挙動を理解して、構造物を作る際にどのように使用すれば最適に動作するのか?を考える際の選択肢として知識が必要になります。数学は、
■ 具象化
■ 抽象化
の相互変換を行うことで状態を理解しやすい形にして判断を行う事になりますが、この2つを組み合わせて使用する分野が解析学になります。現在の高校までのカリキュラムでは、データの活用のカリキュラムでデータ解析の方法や判断の方法が用意されていますが、大学入試だと
■ 数学 I / II
■ 数学 A / B
が必要になりますが、この中に 【 仮説検定 】 なども含まれているので、妥当な条件の判断はどのように行えば良いのかを考える方法を学びます。
こうした判断を行う場合には、正規分布を基準にするわけですが、現在の高校の数学ではこうした正規分布を基準とした判断を行う方法もカリキュラムの中に含まれています。
16世紀辺りまでの数学は、
■ 幾何学
■ 代数学
歯科存在しないので、
【 幾何学 】
コンパスと定規(直線を引くだけ)を使用して
図形を作る技法を体系化したもの
【 代数学 】
数字と式を用いることで変化や法則性を示す
方法を体系化したもの
になります。この内容は義務教育だと
【 幾何学 】
図形の描き方
【 代数学 】
数値と計算
と言う方法で学習していると思いますが、カリキュラムの中には
■ グラフ
■ 体積や面積
というものが登場します。これは、
■ 図形
■ 数値
が組み合わさったものになりますが、これらは、
【 データの集まりや推移を示すツール 】
なので、幾何学とダイス学の双方を組み合わせて使用している分野になります。この辺りのカリキュラムは、半生記以上前から日本の義務教育で行われているものになりますから、少々の高齢者であっても、この辺りを学習していないという人は居ません。
というのも、日本の教育制度は江戸時代の寺子屋に始まり、義務教育は明治時代には始まっていますから 明治19年にはスタートしています。 それ以前に明治9年に義務教育の前身になるような仕組みはありましたが、システムが弱かったので、その改良がされて10年後に現在の義務教育と同じようなシステムが確立されています。
その為、教育の歴史については、日本では江戸時代には庶民の一部になっており、明治19年以降には、極当たり前に義務教育精度が存在しているわけです。
当然、昭和になると、ユークリッド原論などで使用されている極当たり前なものもありますが、江戸時代だと和算が存在しているので、日本独自の算数を使用した考え方も学習できるようになっていました。
高度経済成長期に教育が存在していない国家であったとしたら、そもそも、成長そのものが不可能なはずですから、大昔から教育制度は存在しており、日本が新興国の時代であっても教育レベルがある程度しっかりしたものが用意されていたと言う経緯があります。
その為、バブル期辺りでも極当たり前に算数のカリキュラムでも
■ 代数学
■ 幾何学
■ 解析学
の三盆柱が用意されていますし、義務教育の段階でもそういった基礎固めができるような内容になっています。
昔の教科書だと 【 数字は1の集合である 】 と言う考え方の延長線上として 【 集合 】 と言う概念が用意されていたようですが、現在はこの 【 集まり 】 の概念や処理の方法は高校の数学Cで学習するようになっています。
データと次元数
データと集合については、実際には小学校降雨学年でも扱っていますが、この中では集合と言う概念は登場しません。
ただし、
■ 理科
■ 社会
というカリキュラムは多変数の構造のものを扱っていますし、単体の数ではなく複数の数の取り扱いについては、小学校高学年の算数で
■ 数列(等差数列・等比数列)
■ 比例(正比例・反比例)
を使う際に、(1,2,3,4,5)のような集まりを使うはずですが、これが、 【 異なる数の集まり 】 なので集合になります。その為、小学校の算数では、
■ 代数学 : 答えとしての数字 (単数)
■ 解析学 : データとしての数字(複数)
が存在しています。この二つは、
■ 数式 : 決まった値(推移なし)
■ 比例 : 複数の値 (推移あり)
と考えることが出来ます。小学校だと整数を使った状態で処理を行うのですが、これは 【 サンプリング方法 】 がその状態になっているだけで、比例のグラフは、線分で構成されていますから微細な種数点数の座標の値を代入した時に取得できる値を並べたものになります。
このように少学区の算数では、
■ 止まったもの
■ 変化するもの
を扱いましが、これは理科の分野で
■ 計測 : 止まったもの
■ 集計 : 変化の結果の集まり
を使用する時に必要になるので、この作業を行うための基礎固めとして、こうしたカリキュラムが用意されています。
この時の計測値は一つですが、熱の変化を確認する際に
■ 水道水
■ 水溶液
の場合にどのような変化が生じるのか?を調べる際には、同じ温度でサンプリングをしても、結果が異なるので、異なるデータが生じます。
この場合、棒グラフのように異なるデータを並べることになりますが、これが単一のデータではなく、サンプリング回数を増やして 【 複数回計測する 】 と言う条件になると、この推移は折れ線グラフなどのような線分で表記を刷ることになります。この時にサンプリングを行う対象物が複数存在した場合には、2つのグラフが生成されますが、この際に小学校の比例のカリキュラムのように
■ 帳票
■ グラフ
の形で整理すると、計測値の推移をグラフ上での変化で比較を刷ることが出来るようになります。
この時の比較を
■ 水道水
■ 食塩水
として時間単位の熱量の変化を計測してデータを撮った場合、2つのデータの推移を示すグラフが出来上がります。この時のグラフを
■ グラフA : 水道水
■ グラフB : 食塩水
とした場合、この構成要素であるサンプリング時のデータは、
■ 変数A : 水道水
■ 変数B : 食塩水
と考えることが出来ます。この場合、
■ 単体の液体のグラフ
■ 実験で登場するグラフ
では、グラフの個数が異なるので、関数のように個別に変数を管理すると 【 複数の変数が発生する 】 ことになります。この実験を
【 加熱時間と水溶液の温度変化 】
とした場合、グラフ自体は時間単位の推移ですから、
■ X軸 : 時間軸
■ Y軸 : データ
になるので、平面上の出来事としてサンプリング時のデータを追加することになります。
グラフの構造ですが、
■ サンプリング時の値
■ グラフ
が素材しますが、サンプリング時の値は、一つしか無いので、 【 −∞ 〜 ∞ 】 の範囲から抽出した値ということになります。この場合、一つの値しか存在しませんから、この値は 【 数直線所の座標 】 と考えることが出来ます。つまり、
▼
0 1 2 3 4 5 6 7 8 9
┣━╋━╋━╋━╋━╋━╋━╋━╋━┫
のようなものになります。グラフでは、この構造物に層をもたせて
▼
0 1 2 3 4 5 6 7 8 9
┣━╋━╋━╋━╋━╋━╋━╋━╋━┫
▼
0 1 2 3 4 5 6 7 8 9
┣━╋━╋━╋━╋━╋━╋━╋━╋━┫
▼
0 1 2 3 4 5 6 7 8 9
┣━╋━╋━╋━╋━╋━╋━╋━╋━┫
▼
0 1 2 3 4 5 6 7 8 9
┣━╋━╋━╋━╋━╋━╋━╋━╋━┫
のような状態のものを扱っているわけですが、流石に吸う直線の羅列にすると見づらい上に、訳が解らなくなりますから、これを平面状の座標として扱うことになります。これが、小学校高学年で登場するグラフになります。グラフの形にすると、
9 ┣
┃
8 ┣
┃
7 ┣
┃
6 ┣
┃
5 ┣
┃
4 ┣
┃
3 ┣
┃
2 ┣
┃
1 ┣
┃
┣━╋━╋━╋━╋━╋━╋━╋━╋━┫
0 1 2 3 4 5 6 7 8 9
のようになりますから、
9 ┣
┃
8 ┣
┃
7 ┣
┃
6 ┣
┃
5 ┣
┃
4 ┣
┃
3 ┣
┃
2 ┣
┃
1 ┣━━━━┓
┃ ┃
┣╋━╋━╋━╋━╋━╋━╋━╋━┫
0 1 2 3 4 5 6 7 8 9
のように工程を取得することで座標を彫っることが出来ます。
これが、グラフになりますが、座標を取得する際には2つの値を使用しますから、座標軸も2つ使用することになります。
このようにグラフを生成する場合には、
■ データの取得 : 1つの座標軸
■ グラフの生成 : 2つの座標軸
を使用しますが、数学では、この座標軸の数のことを次元数として考えるので、
■ データの取得 : 1次元
■ グラフの生成 : 2次元
として扱います。グラフの座標を示す際に
■ (X,Y)
を用いるので、
■ (2,1)
のように表記することになります。この時の状態は、
■ 変数X
■ 変数Y
の2つを格納したものになりますが、コンピューターでデータを扱う際にも、次元数のが増えるとこのような形で管理することになります。
コンピューターとデータ
コンピューターでデータを扱う際には、次元数で取り扱いが異なりますが、グラフィックツールではベクトルと同じ座標姓GYをするので、多変数の構造も数学と同じ状態になります。
これは、ベクターグラフィックを扱う場合の処理になりますが、この時の処理が高校の数学で学習する内容やその応用分野になっています。
現在は、メーカーがゲーム開発に使用しているゲームエンジンを故事が使用できる時代になっていますから、ゲームエンジンでアプリケーションを作ると言う選択肢もありますが、この時に
■ データ部分
■ 表示部分
■ 処理部分
を分けて考えることになります。ゲームエンジンでも制御部分はコーディングが必要になりますから、コードを書いて制御することになりますが、表示についても内積を使う処理やヒョじそのものをコードで制御することが出来ます。
この時に使用するのがシェーダーになりますが、シェーダーについては、ポリゴンの内積と外積での処理も行えるので、コードで表示を制御することが出来るようになっています。シェーダーを使用する際にはライブラリの選択が必要になりますが、この時に
■ GLSL
■ HLSL
の選択が出来るようになっています。
これらは、VisualStudioでも行えますが、アーキテクチャやOSでしよづえ着るものが変わってくるので、それに準じたものを使用することになります。
シェーダーのプログラミングを行う場合に登場するのがベクターを扱うvector4などになりますが、これは次元数を扱ったものになります。vector 4は四次元ベクトルなので、完全に数ベクトルと考えて扱うことが出来るようになっていますが、RGBAのようなカラーデータを格納する際には4つの異なる変数が必要になるので、こういった多変数を格納する仕組みが必要になります。この他にも
■ vector 2
■ vector 3
も存在しますが、この場合だと現実世界で使用している平面と空間と同じなので、前者だとUV空間や座標平面を扱えますし、後者だと立体を扱う際に使用できます。
データを扱う場合だと、次元数で呼び名が決まっており、
■ 一次元 : スカラー(スケーラー)
■ 二次元 : ベクター(ベクトル)
■ 三次元 : テンソル(テンサー)
となっています。CPUに内蔵されている演算器についても、こうしたsyリに特化したものが包含されていますが、スカラー演算は世代が変わるたびに倍速になっているので、数世代古いアーキテクチャだと速度差が出やすくなっています。
また、スカラーでテンソルの計算を刷るとものすごく遅くなるので、専用の演算器があったほうがいいのですが、これはベクター演算についても同様のことが言えます。
その為、コンピューターのCPUの場合、 【 世代が変わると処理の根幹となる演算性能が違ってくる 】 ので、徳衛のアプリケーションを走らせた時のスコアとは異なる結果とは全く違った性能差になっている場合がります。
この基本性能が存在した時に 【 そのアーキテクチャに合わせた設計にすると高速になる 】 わけですが、商業ベースで運用されている 【 市販おソフトウェア 】 の場合、アーキテクチャ依存を高くすると 【 ユーザーの絶対数が減る 】 ので、ある程度広い範囲を指定して製品開発が行われています。
そうすることで 【 推奨環境以上 】 という条件のユーザーのそすのを増やしてあるわけですが、個人が所有しているPCの場合だと、 【 自分の環境で最速にすればいい 】 ので互換性のことを考える必要がないので、理論上、アーキテクチャ依存度の低いアプリケーションよりも高速にすることが出来ます。
その為、アプリケーションン開発を刷る場合には、
■ 動作環境
■ 推奨環境
■ 最高品質で出来ること
■ 上限で必要な環境
を用意することになりますが、開発を行う場合には、最高品質の動作角煮が必要なので、個人の場合だと、所有しているPCの処理能力の上限が、製作可能なアプリケーションの挙動に対して指定できる上限ということになります。これはゲームを作る場合に該当する内容になりますが、サンドボックス系のように 【 やりこむほどに重たくなる 】 ようなものは少し異なりますが、決まった仕組みを用意して動かす構図のもので 【 処理の上右舷が制作段階で決まっている 】 物を作る場合だと、所有しているPCが動作確認を行う環境なので、それが上限として動作する物を作ることになります。
このようにデータを扱う際には、他変数の門を御使用することがありますが、座標軸で制御できる幾何ベクトルのような構造ではなく、それ以上の次元数が必要になるデータについては 【 行列 】 を用いることになります。この構造物に多くの変数を格納して制御するのが数ベクトルで、この制御をするのに使用するのが 【 線形代数 】 になります。
主キーと外部キー
これは、リレーショナルデータベースで使用されているものになりますが、リレーショナルデータベースは、レコードの中に複数のデータを登録して管理することになりますが、このレコードを管理するためのインデックスを振って管理する仕様になっています。このインデックスを主キーとすることで番号でレコードを呼び出すことが出来るようになっています。
これは、テーブルレベルで使用することが出来るようになっていますが、一つのテーブルに複数のデータをあ苦悩すると扱いに来ので、カテゴリーで分けて管理できるものは別のテーブルに分けて使用することになります。
このようにテーブルを分けるとテーブル単位で連携させる必要がありますが、この時に使用するのがリレーションシップになります。ちなみの、この機能は現在のマイクロソフトオフィースのExcel二実装冴えていますが、現在のExcelには、パワークエリーというクエリーの機能も実装されているので、Accessで実装されているようない機能が複数実装されています。
配列を使用した場合も管理方法によって同じようなデータの管理が行えるようになっているので、基本となる小さなデータの集まりのテーブルを作っておいて、その主キーの値に対して別のデータを関連付けることで複雑なデータの管理を行うことが出来ます。
ExcelのやAccessはん次元配列のデータを使用しますが、一次元の配列の構造はAccessのレコードと同じなので、コレを多次元化することで二次元にすることが出来ます。その為、この一次元の配列の構造をどのように管理するのかで、管理の仕方も変わってきます。
その為、レコード部分でどのようなデータが格納され、それをどのよに分類して連携させるのかを考えてテーブルを作ることになります。
Accessの場合だと、テーブルは自動で追加されますが、この構造は二次元配列ですから、Pythonで配列を使う場合には、二次元配列の中に用意した一次元配列の構造が格納されるような仕組みになります。
これに似た構造はスプレッドシートでも作れるので、OSSのオフィースソフトの
でも使用できます。この中のCALCがスプレッドシートになりますが、
のような3つのひょうを作り、
のように区分けとランクのような分類を行う際に、
メニューのデータから 【 データの入力規則 】 の項目を選択すると、
の条件から
のように 【 セルの選択 】 を指定して、ソースに
のようにプルダウンが追加されます。このプルダウンをクリックすると、
のように指定範囲のデータを入力できるようになっています。
リレーショナル・データベースでは、
のような感じでレコードがあり、その中に主キーを用意して管理を刷ることになります。この時にさきほどのような管理をする場合には、リレーションシップを用意することになります。これは、
のような異なるものをIDで繋いで利用する仕組みになりますが、これが、 【 外部キーによる管理 】 になります。
データベースの場合だと
のようになっているので、外部キーを格納しているテーブルにはデータが大量に存在しますが、読み込んで適応する外部キーで値を使うので、使用する数は1つしかありません。その為、画像のような繋がり方で制御することになります。
配列を使用する
配列を指定する場合、
【 配列の指定 】
配列名=[要素,要素,要素,要素,]
のように指定しますが、この要素を呼びあす場合にはインデックスを使用するので、
【 配列の呼び出し 】
配列名[インデックス]
で指定します。その為、
のような形で管理することが出来ます。
この配列の塊は、一つのフィールドとして考えることが出来ます。Excelだとセルに該当しますが、一次元で考えた時に格納するデータを一つの配列で管理した場合、配列単位で役割分担を刷ると、インデックスで用紙を追加したデータを作ることが出来ます。
この場合、【 配列をカテゴリーの分別ようの項目 】 として使用することになりますが、この場合、基準となるデータを用意しておいて、それに追加する形になりますから、
■ データ全体としまとめたもの
■ 個別の要素として存在しているもの
で管理方法を分けて使用することになります。こえrが、リレーショナル・データベースの考え方になりますが、Pythnの配列もデータ参照が可能なので、要素を変数にすることで、指定した値を代入することが出来るようになっています。例えば、
のようなコードを書くと配列内に指定した変数の値を代入することが出来ます。この時のデータですが、
のような単体のデータを
のような多次元のデータの中に代入して使用することが出来ます。この参照については、配列内のデータ参照も可能なので、
のような処理も出来ます。このコードでは、
のように単体のデータではなく、複数のデータを格納した配列を使っていますが、これを
のように3つ用意しています。このデータを
のように配列の中に格納してインデックスで呼び出すと
のように指定した値が格納されていることが解ります。
この事例では一次元の配列なので、高校の数学で登場する集合のような集まりになっていますが、これは、多次元化することが出来るので、二次元配列にすることも出来ます。
高校の情報Iでは、R言語やmatplotlibを使用することになりますが、この時のデータをCSVやExcelのファイルではなく、二次元配列にすると、
a=[
[1,1,1],
[1,1,1],
[1,1,1]
]
のように一次元配列をデータとして配列の中に格納した形になります。その為、
の2つは同じ構造のデータを異なる形で示したものになります。