Numphp-数値ベクトル配列と行列を操作する

今日は、php numphpで数値配列を操作するための素晴らしいライブラリについての話を続けたいと思います。 以前、私はすでにここで簡単なレビューをしました 。 それ以来、ライブラリは機能で大きくなりすぎており、最も重要なのは、多次元配列または行列を操作することを学んだことです。 それらについては、基本的に話します。

不要なイントロなしで、すぐにnumphpの機能を使用して3 x 4のマトリックスを作成する方法の例。

$matrix = new np_array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]); // matrix [[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]] 

その結果、np_arrayオブジェクトを取得します。 さらに、行列の各行もこのタイプのオブジェクトです。 これにより、ユニバーサルサンプリングが可能になります。
たとえば、2行目にアクセスするには、標準ロジックを使用できます

 $row = $matrix[1]; //row [4, 5, 6, 7] 

しかし、それは面白くないだろう=)

マトリックスのスライスはnp_arrayであるため、たとえば3行全体の平均値など、一気に学習できます。

 $avg = $matrix[2]->mean(); // avg 9.5 

さらに、比較演算子を使用して、5つ以上など、条件を満たすすべての行列要素を選択できます。

 $result = $matrix[$matrix->gt(5)] // or $result = $matrix[$matrix['> 5']] // result [ 6, 7, 8, 9, 10, 11] 

そして、その量を取得

 $result = $matrix[$matrix['> 5']]->sum() // result 51 

上で述べたように、numphpで実装されたスライスのフルパワーを使用でき、マトリックスにも適用できます。 たとえば、2行目と3行目

 $result = $matrix['1:3']; // result [[ 4, 5, 6, 7], [ 8, 9, 10, 11]] 

機能の詳細については、 ライブラリのドキュメントをご覧ください。

数学演算


現時点では、ベクトル配列と同じ操作を行列に適用できます。 操作は、元のマトリックスの各要素に適用されます。

 $result = $matrix->mul(5); // multiply // result [[ 0, 5, 10, 15], [20, 25, 30, 35], [40, 45, 50, 55]] 

マトリックスとベクトルを要約することもできます。 この場合、ベクトルは行列の各行と合計されます

 $result = $matrix->add([1, 2, 3, 4]); [[ 1, 3, 5, 7], [ 5, 7, 9, 11], [ 9, 11, 13, 15]] 

または、2つのマトリックスをまとめます。 ここでは、必要なサイズのマトリックスを生成する方法の1つが表示されます。

 $diffMartrix = Generator::ones([3, 4]); // diffMartrix [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]] $result = $matrix->add($diffMatrix); // result [[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]] 

したがって、行列とベクトルの処理を大幅に簡素化および高速化することができます。

サイズ変更


各np_arrayオブジェクトは、その形状を簡単に変更できます。 フォームとは、特定のオブジェクトの次元を意味します。 例えば

 $list = new np_array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); $list->shape // [10] $matrix = new np_array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]); $matrix->shape // [3, 4] 

簡単に言えば、最初の数は行の数を意味し、2番目は列の数を意味すると仮定できます。 ただし、ライブラリを使用するとn次元配列を操作できることを理解することが重要です。

例からマトリックスを取得して、たとえば座標ボード上のポイントの配列を作成する場合、6x2マトリックスに変換できます。

 $newMatrix = $matrix->reshape([6, 2]); // newMatrix [[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7], [ 8, 9], [10, 11]] 

n次元配列を1次元として表す必要がある場合は、flattenメソッドを使用できます

 $result = $matrix->flatten(); // result [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 

このアプローチは、目的の形状のある種のテストデータセットを迅速に生成するのに便利です。

 $result = Generator::arange(1, 15)->reshape([2, 7]); // result [[ 1, 2, 3, 4, 5, 6, 7], [ 8, 9, 10, 11, 12, 13, 14]] 

ここで最後に説明したいことですが、ライブラリができる最後のこととはほど遠いのは、行列の斜めのスライスを扱うことです。

 $matrix = Generator::arange(16)->reshape([4, 4]); // matrix [[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]] // get matrix diagonal $result = $matrix->diagonal(); //result [ 0, 5, 10, 15] 

ほぼ同様の方法で、与えられた対角線で行列を生成できます

 $matrix = Generator::diagonal([5, 3, 1]); // matrix [[5, 0, 0], [0, 3, 0], [0, 0, 1]] 

実際、ライブラリには、任意の次元の数値配列と行列を操作するためのより多くの快適で便利なものが含まれています。 それらを組み合わせることにより、データに基づいて非常に迅速かつ簡単に計算を行うことができます。 計画にはまだ実装したいことがたくさんあるので、ライブラリの作業は継続されます。

追加の機能とドキュメントはこちらにあります

また、開発に貢献したい場合は、問題について話し合うことができます。

Source: https://habr.com/ru/post/J347882/


All Articles