PythonのNumPy。 パート1

翻訳者の序文



こんにちは、Habr。 参考文献numpyによる小さなマナの翻訳である一連の記事を始めます 。 良い読書をしてください。







はじめに



NumPyは、プリコンパイルされた高速関数の形式で一般的な数学および数値演算を提供する、Python用のオープンソースモジュールです。 これらは高レベルのパッケージにまとめられています。 MatLabの機能と比較できる機能を提供します。 NumPy(数値Python)は、大きな配列と行列を操作するための基本的な方法を提供します。 SciPy(Scientific Python)は、numpy機能を、最小化、フーリエ変換、回帰、およびその他の応用数学手法などの便利なアルゴリズムの膨大なコレクションで拡張します。



設置



Python(x、y)がある場合( 翻訳者注: Python(x、y)、これはPythonプログラミング言語と多数のモジュール(ライブラリ)に基づくデータの数値計算、分析、視覚化のための無料の科学および工学ソフトウェアの配布です) Windowsプラットフォームでは、開始する準備ができています。 そうでない場合は、Pythonをインストールした後、自分でパッケージをインストールする必要があります。最初にNumPy、次にSciPyをインストールします。 ここからインストールできます 。 ページのインストールに従ってください、そこにはすべてが非常に明確です。



少しの追加情報



NumPyおよびSciPyコミュニティは、ガイドとチュートリアルを含むオンラインガイドをサポートしています(docs.scipy.org/doc)。



numpyモジュールをインポートする



インポートする方法はいくつかあります。 標準的な方法は、単純な式を使用することです:



>>> import numpy
      
      





ただし、numpy関数の多数の呼び出しでは、numpy.Xを何度も記述するのは面倒です。 代わりに、次のように行う方がはるかに簡単です。



 >>> import numpy as np
      
      





この式により、numpy.Xではなくnp.Xを使用してnumpyオブジェクトにアクセスできます。 numpyを名前空間に直接インポートして、ドットを使用した関数をまったく使用せず、直接呼び出すこともできます。



 >>> from numpy import *
      
      





ただし、このオプションは、モジュールが提供するいくつかの有用な構造を削除するため、Pythonプログラミングでは歓迎されません。 このチュートリアルの最後まで、2番目のインポートオプション(numpyをnpとしてインポート)を使用します。



配列



numpyの主な機能は配列オブジェクトです。 配列はPythonのリストに似ていますが、配列の要素はfloatやintなどの同じデータ型でなければなりません。 配列は、大量の情報を使用して数値演算を何倍も高速に実行できます。最も重要なことは、リストを使用するよりもはるかに効率的です。



リストから配列を作成する:



 a = np.array([1, 4, 5, 8], float) >>> a array([ 1., 4., 5., 8.]) >>> type(a) <class 'numpy.ndarray'>
      
      





ここで、配列関数は2つの引数を取ります。配列に変換するリストと、各要素の型です。 すべての要素は、通常のリストと同じ方法でアクセスおよび操作できます。



 >>> a[:2] array([ 1., 4.]) >>> a[3] 8.0 >>> a[0] = 5. >>> a array([ 5., 4., 5., 8.])
      
      





配列は多次元にすることができます。 リストとは異なり、コマンドを角かっこで指定できます。 2次元配列(マトリックス)の例を次に示します。



 >>> a = np.array([[1, 2, 3], [4, 5, 6]], float) >>> a array([[ 1., 2., 3.], [ 4., 5., 6.]]) >>> a[0,0] 1.0 >>> a[0,1] 2.0
      
      





配列スライシングは、1次元配列の場合と同様に多次元配列でも機能し、各スライスを確立された測定のフィルターとして適用します。 ディメンションで「:」を使用して、このディメンションのすべての要素の使用を示します。



 >>> a = np.array([[1, 2, 3], [4, 5, 6]], float) >>> a[1,:] array([ 4., 5., 6.]) >>> a[:,2] array([ 3., 6.]) >>> a[-1:, -2:] array([[ 5., 6.]])
      
      





shapeメソッドは、行列の行と列の数を返します。



 >>> a.shape (2, 3)
      
      





dtypeメソッドは、配列に格納されている変数のタイプを返します。



 >>> a.dtype dtype('float64')
      
      





ここで、float64は、倍精度実数を格納するために使用されるnumpy数値データ型です。 Pythonのフロートはどうでしょう。



lenメソッドは、最初の次元(軸)の長さを返します。



 a = np.array([[1, 2, 3], [4, 5, 6]], float) >>> len(a) 2
      
      





inメソッドは、配列内の要素の存在を確認するために使用されます。



 >>> a = np.array([[1, 2, 3], [4, 5, 6]], float) >>> 2 in a True >>> 0 in a False
      
      





新しい多次元配列を定義するメソッドを使用して、配列を再編成できます。 次の例に従って、10要素の1次元配列を5行2列の2次元配列に再フォーマットします。



 >>> a = np.array(range(10), float) >>> a array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) >>> a = a.reshape((5, 2)) >>> a array([[ 0., 1.], [ 2., 3.], [ 4., 5.], [ 6., 7.], [ 8., 9.]]) >>> a.shape (5, 2)
      
      





reshapeメソッドは新しい配列を作成し、元の配列を変更しないことに注意してください。



Pythonでの名前バインディングは配列でも機能することに注意してください。 copyメソッドは、メモリ内の既存の配列のコピーを作成するために使用されます。



 >>> a = np.array([1, 2, 3], float) >>> b = a >>> c = a.copy() >>> a[0] = 0 >>> a array([0., 2., 3.]) >>> b array([0., 2., 3.]) >>> c array([1., 2., 3.])
      
      





リストは配列からも作成できます。



 >>> a = np.array([1, 2, 3], float) >>> a.tolist() [1.0, 2.0, 3.0] >>> list(a) [1.0, 2.0, 3.0]
      
      





配列をバイナリ文字列(つまり、人間が読み取れない形式)に変換することもできます。 これを行うには、tostringメソッドを使用します。 fromstringメソッドは、逆変換で機能します。 これらの操作は、将来読み込まれる可能性のあるファイルに大量のデータを保存するのに役立つ場合があります。



 >>> a = array([1, 2, 3], float) >>> s = a.tostring() >>> s '\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@' >>> np.fromstring(s) array([ 1., 2., 3.])
      
      





配列に同じ値を入力します。



 >>> a = array([1, 2, 3], float) >>> a array([ 1., 2., 3.]) >>> a.fill(0) >>> a array([ 0., 0., 0.])
      
      





配列の転置も可能です。新しい配列を作成します。



 >>> a = np.array(range(6), float).reshape((2, 3)) >>> a array([[ 0., 1., 2.], [ 3., 4., 5.]]) >>> a.transpose() array([[ 0., 3.], [ 1., 4.], [ 2., 5.]])
      
      





flattenメソッドを使用して、多次元配列を1次元配列に変換できます。



 >>> a = np.array([[1, 2, 3], [4, 5, 6]], float) >>> a array([[ 1., 2., 3.], [ 4., 5., 6.]]) >>> a.flatten() array([ 1., 2., 3., 4., 5., 6.])
      
      





concatenateメソッドを使用して、2つ以上の配列を連結できます。



 >>> a = np.array([1,2], float) >>> b = np.array([3,4,5,6], float) >>> c = np.array([7,8,9], float) >>> np.concatenate((a, b, c)) array([1., 2., 3., 4., 5., 6., 7., 8., 9.])
      
      





配列が1次元でない場合、接続が発生する軸を指定できます。 デフォルトでは(軸の値を指定せずに)、最初の測定に従って接続が行われます。



 >>> a = np.array([[1, 2], [3, 4]], float) >>> b = np.array([[5, 6], [7,8]], float) >>> np.concatenate((a,b)) array([[ 1., 2.], [ 3., 4.], [ 5., 6.], [ 7., 8.]]) >>> np.concatenate((a,b), axis=0) array([[ 1., 2.], [ 3., 4.], [ 5., 6.], [ 7., 8.]]) >>> np.concatenate((a,b), axis=1) array([[ 1., 2., 5., 6.], [ 3., 4., 7., 8.]])
      
      





結論として、角括弧内のnewaxis定数を使用して、配列の次元を増やすことができます。



 >>> a = np.array([1, 2, 3], float) >>> a array([1., 2., 3.]) >>> a[:,np.newaxis] array([[ 1.], [ 2.], [ 3.]]) >>> a[:,np.newaxis].shape (3,1) >>> b[np.newaxis,:] array([[ 1., 2., 3.]]) >>> b[np.newaxis,:].shape (1,3)
      
      





ここで、各配列は2次元であることに注意してください。 newaxisを使用して作成された次元は1です。 newaxisメソッドは、ベクトルおよび行列数学で適切な次元の配列を簡単に作成するのに適しています。



これが翻訳の最初の部分の終わりです。 ご清聴ありがとうございました。



All Articles