NumPy、初心者向けのガイド。 パート1

NumPyLogo NumPyはPython言語の拡張であり、大規模な多次元配列と行列のサポートを追加し、これらの配列を操作するための高レベルの数学関数の大規模なライブラリを追加します。



チュートリアルの最初の部分では、NumPyの操作の基本について説明します。配列、その属性、基本操作、要素ごとの関数の適用、インデックス、スライス、反復を作成します。 配列の形状を変換したり、複数の配列を結合したり、その逆を行ったりするさまざまな操作-1つをいくつかの小さな配列に分割することを検討します。 最後に、表面コピーとディープコピーについて説明します。



基本



NumPyをまだインストールしていない場合は、 ここから入手できます 。 使用されているPythonのバージョンは2.6です。



NumPyの主なオブジェクトは、同種の多次元配列です。 これは、すべて同じタイプの要素(通常は数字)の表であり、自然数のシーケンスによってインデックスが付けられています。



配列の「多次元性」とは、複数の次元または軸を持つことができることを意味します。 「測定」という言葉はあいまいなので、代わりに「軸」と「軸」という言葉をより頻繁に使用します。 軸の数はランクと呼ばれます。



たとえば、3次元空間のポイントの座標[1、2、1]はランク1の配列であり、1つの軸のみを持ちます。 この軸の長さは3です。別の例、配列



[[ 1., 0., 0.],

[ 0., 1., 2.]]








ランク2配列を表します(つまり、2次元配列です)。 最初の次元(軸)の長さは2、2番目の軸の長さは3です。詳細については、 Numpy Glossaryを参照してください。



多次元配列クラスはndarray



と呼ばれndarray



。 これはPython標準ライブラリのarray



クラスとは異なり、1次元配列にのみ使用されます。 ndarray



オブジェクトの最も重要な属性はndarray



です。



ndarray.ndim-配列の軸(次元)の数。 すでに述べたように、Pythonの世界では、次元の数はしばしばランクと呼ばれます。



ndarray.shape-配列の次元、形状。 これは、各軸に沿った配列の長さを示す自然数のタプルです。 nm列の行列の場合shape



(n,m)



ます。 shape



タプルの要素の数は、配列のランク、つまりndim



ます。



ndarray.sizeは、配列内のすべての要素の数です。 shape



属性のすべての要素の積に等しくなります。



ndarray.dtype-配列要素のタイプを記述するオブジェクト。 標準のPythonデータ型を使用してdtype



を定義できます。 NumPyは、たとえばbool_, character, int_, int8, int16, int32, int64, float_, float8, float16, float32, float64, complex_, complex64, object_



ます。



ndarray.itemsize-各配列要素のサイズ(バイト単位)。 たとえば、 float64



型の要素の配列の場合、 itemsize



float64



値は8(= itemsize



)であり、 complex32



この属性は4(= complex32



)です。



ndarray.data-配列の実際の要素を含むバッファー。 通常、インデックスを使用して配列の要素にアクセスするため、この属性を使用する必要はありません。





次の配列を定義します。

Copy Source | Copy HTML<br/>>>> from numpy import *<br/>>>> a = arange( 10 ).reshape( 2 , 5 )<br/>>>> a<br/> array ([[ 0 , 1 , 2 , 3 , 4 ],<br/> [ 5 , 6 , 7 , 8 , 9 ]]) <br/>







aという名前の配列オブジェクトを作成しまし 。 配列aには、いくつかの属性またはプロパティがあります。 Pythonでは、個々のオブジェクトの属性はname_of_object.attribute



と呼ばれます。 私たちの場合:



これらの属性はすべて、インタラクティブに入力するだけで確認できます。

Copy Source | Copy HTML<br/>>>> a.shape<br/>( 2 , 5 )<br/>>>> a.dtype.name<br/> 'int32' <br/>





などなど。



配列の作成



配列を作成するには多くの方法があります。 たとえば、 array()



関数を使用して、通常のPythonリストまたはタプルから配列を作成できます。

Copy Source | Copy HTML<br/>>>> from numpy import *<br/>>>> a = array ( [ 2 , 3 , 4 ] )<br/>>>> a<br/> array ([ 2 , 3 , 4 ])<br/>>>> type (a)<br/><type 'numpy.ndarray' > <br/>







array()



関数は、ネストされたシーケンスを多次元配列に変換します。 配列のタイプは、元のシーケンスの要素のタイプによって異なります。

Copy Source | Copy HTML<br/>>>> b = array ( [ ( 1 . 5 , 2 , 3 ), ( 4 , 5 , 6 ) ] ) # float <br/>>>> b<br/> array ([[ 1 . 5 , 2 . , 3 . ],<br/> [ 4 . , 5 . , 6 . ]]) <br/>







配列を取得したら、その属性を確認できます。

Copy Source | Copy HTML<br/>>>> b.ndim # <br/> 2 <br/>>>> b.shape # <br/>( 2 , 3 )<br/>>>> b.dtype # (8- float) <br/>dtype( 'float64' )<br/>>>> b.itemsize # <br/> 8 <br/>







配列のタイプは、作成時に明示的に指定できます。

Copy Source | Copy HTML<br/>>>> c = array ( [ [ 1 , 2 ], [ 3 , 4 ] ], dtype=complex )<br/>>>> c<br/> array ([[ 1 .+ 0 .j, 2 .+ 0 .j],<br/> [ 3 .+ 0 .j, 4 .+ 0 .j]]) <br/>







よくある間違いは、数のリストとして想定されている単一の引数の代わりに、多くの数値引数でarray()



関数を呼び出すことです。



Copy Source | Copy HTML<br/>>>> a = array ( 1 , 2 , 3 , 4 ) # WRONG <br/>>>> a = array ([ 1 , 2 , 3 , 4 ]) # RIGHT <br/>







array()



関数は、配列を作成する唯一の関数ではありません。 通常、配列の要素は最初は不明であり、それらが格納される配列はすでに必要です。 したがって、ある種のソースコンテンツを含む配列を作成するための関数がいくつかあります。 デフォルトでは、作成された配列のタイプはfloat64



です。



zeros()



関数はゼロの配列を作成し、 ones()



関数は1の配列を作成します。

Copy Source | Copy HTML<br/>>>> zeros( ( 3 , 4 ) ) # <br/> array ([[ 0 ., 0 ., 0 ., 0 .],<br/> [ 0 ., 0 ., 0 ., 0 .],<br/> [ 0 ., 0 ., 0 ., 0 .]])<br/>>>> ones( ( 2 , 3 , 4 ), dtype=int16 ) # dtype <br/> array ([[[ 1 , 1 , 1 , 1 ],<br/> [ 1 , 1 , 1 , 1 ],<br/> [ 1 , 1 , 1 , 1 ]],<br/> [[ 1 , 1 , 1 , 1 ],<br/> [ 1 , 1 , 1 , 1 ],<br/> [ 1 , 1 , 1 , 1 ]]], dtype=int16) <br/>







empty()



関数は、データを入力せずに配列を作成します。 元のコンテンツはランダムであり、配列が作成された時点のメモリの状態(つまり、そこに格納されているガベージ)に依存します。

Copy Source | Copy HTML<br/>>>> empty( ( 2 , 3 ) )<br/> array ([[ 3 .73603959e- 262 , 6 .02658058e- 154 , 6 .55490914e- 260 ],<br/> [ 5 .30498948e- 313 , 3 .14673309e- 307 , 1 .00000000e+ 000 ]])<br/>>>> empty( ( 2 , 3 ) ) # <br/> array ([[ 3 .14678735e- 307 , 6 .02658058e- 154 , 6 .55490914e- 260 ],<br/> [ 5 .30498948e- 313 , 3 .73603967e- 262 , 8 .70018275e- 313 ]]) <br/>







数字のシーケンスを作成するために、NumPyにはrange()



似た機能がありますが、リストの代わりに配列を返します。

Copy Source | Copy HTML<br/>>> arange( 10 , 30 , 5 )<br/> array ([ 10 , 15 , 20 , 25 ])<br/>>>> arange( 0 , 2 , 0 . 3 )<br/> array ([ 0 . , 0 . 3 , 0 . 6 , 0 . 9 , 1 . 2 , 1 . 5 , 1 . 8 ]) <br/>







float



型の引数でarange()



を使用する場合、(浮動小数点数の精度に制限があるため)受信される要素の数を確認するのは困難です。 したがって、そのような場合、通常、 linspace()



関数を使用する方が適切です。この関数は、ステップの代わりに、必要な要素の数に等しい数を引数の1つとして取ります。

Copy Source | Copy HTML<br/>>>> linspace( 0 , 2 , 9 ) # 9 0 2 <br/> array ([ 0 . , 0 . 25 , 0 . 5 , 0 . 75 , 1 . , 1 . 25 , 1 . 5 , 1 . 75 , 2 . ])<br/>>>> x = linspace( 0 , 2 *pi, 100 ) # <br/>>>> f = sin(x) <br/>







配列の印刷



配列を印刷すると、NumPyはネストされたリストに似た方法でそれらを表示しますが、それらの配置は少し異なります。



1次元配列は文字列として、2次元配列はマトリックスとして、3次元配列はマトリックスのリストとして表示されます。

Copy Source | Copy HTML<br/>>>> a = arange( 6 ) # 1d array <br/>>>> print a<br/>[ 0 1 2 3 4 5 ]<br/>>>><br/>>>> b = arange( 12 ).reshape( 4 , 3 ) # 2d array <br/>>>> print b<br/>[[ 0 1 2 ]<br/> [ 3 4 5 ]<br/> [ 6 7 8 ]<br/> [ 9 10 11 ]]<br/>>>><br/>>>> c = arange( 24 ).reshape( 2 , 3 , 4 ) # 3d array <br/>>>> print c<br/>[[[ 0 1 2 3 ]<br/> [ 4 5 6 7 ]<br/> [ 8 9 10 11 ]]<br/> [[ 12 13 14 15 ]<br/> [ 16 17 18 19 ]<br/> [ 20 21 22 23 ]]] <br/>







配列が大きすぎて印刷できない場合、NumPyは自動的に配列の中心を非表示にし、角のみを表示します。

Copy Source | Copy HTML<br/>>>> print arange( 10000 )<br/>[ 0 1 2 ..., 9997 9998 9999 ]<br/>>>><br/>>>> print arange( 10000 ).reshape( 100 , 100 )<br/>[[ 0 1 2 ..., 97 98 99 ]<br/> [ 100 101 102 ..., 197 198 199 ]<br/> [ 200 201 202 ..., 297 298 299 ]<br/> ...,<br/> [ 9700 9701 9702 ..., 9797 9798 9799 ]<br/> [ 9800 9801 9802 ..., 9897 9898 9899 ]<br/> [ 9900 9901 9902 ..., 9997 9998 9999 ]] <br/>







大きな配列で発生するすべてを実際に確認し、完全に出力する必要がある場合は、 set_printoptions()



印刷設定関数を使用します。

Copy Source | Copy HTML<br/>>>> set_printoptions(threshold=nan) <br/>







基本操作



配列の算術演算は、要素ごとに実行されます 。 新しい配列が作成され、オペレーターのアクションの結果が入力されます。

Copy Source | Copy HTML<br/>>>> a = array ( [ 20 , 30 , 40 , 50 ] )<br/>>>> b = arange( 4 )<br/>>>> c = ab<br/>>>> c<br/> array ([ 20 , 29 , 38 , 47 ])<br/>>>> b** 2 <br/> array ([ 0 , 1 , 4 , 9 ])<br/>>>> 10 *sin(a)<br/> array ([ 9 . 12945251 , - 9 . 88031624 , 7 . 4511316 , - 2 . 62374854 ])<br/>>>> a< 35 <br/> array ([True, True, False, False], dtype=bool) <br/>







行列アプローチとは異なり、NumPy配列の積*演算子も要素ごとに機能します。 マトリックス積は、 dot()



関数を使用するか、マトリックスオブジェクトを作成することで実装できます。マトリックスオブジェクトは後で検討します(マニュアルの第2部で)。

Copy Source | Copy HTML<br/>>>> A = array ( [[ 1 , 1 ],<br/>... [ 0 , 1 ]] )<br/>>>> B = array ( [[ 2 , 0 ],<br/>... [ 3 , 4 ]] )<br/>>>> A*B # <br/> array ([[ 2 , 0 ],<br/> [ 0 , 4 ]])<br/>>>> dot(A,B) # <br/> array ([[ 5 , 4 ],<br/> [ 3 , 4 ]]) <br/>







一部の操作は、新しい配列を作成せずに「インプレース」で実行されます。

Copy Source | Copy HTML<br/>>>> a = ones(( 2 , 3 ), dtype=int)<br/>>>> b = random . random (( 2 , 3 ))<br/>>>> a *= 3 <br/>>>> a<br/> array ([[ 3 , 3 , 3 ],<br/> [ 3 , 3 , 3 ]])<br/>>>> b += a<br/>>>> b<br/> array ([[ 3 . 69092703 , 3 . 8324276 , 3 . 0114541 ],<br/> [ 3 . 18679111 , 3 . 3039349 , 3 . 37600289 ]])<br/>>>> a += b # b int <br/>>>> a<br/> array ([[ 6 , 6 , 6 ],<br/> [ 6 , 6 , 6 ]]) <br/>







異なるタイプの配列を使用する場合、結果の配列のタイプは、より一般的またはより正確なタイプに対応します。

Copy Source | Copy HTML<br/>>>> a = ones( 3 , dtype=int32)<br/>>>> b = linspace( 0 ,pi, 3 )<br/>>>> b.dtype.name<br/> 'float64' <br/>>>> c = a+b<br/>>>> c<br/> array ([ 1 . , 2 . 57079633 , 4 . 14159265 ])<br/>>>> c.dtype.name<br/> 'float64' <br/>>>> d = exp(c*1j)<br/>>>> d<br/> array ([ 0 . 54030231 + 0 .84147098j, - 0 . 84147098 + 0 .54030231j,<br/> - 0 . 54030231 - 0 .84147098j])<br/>>>> d.dtype.name<br/> 'complex128' <br/>







配列のすべての要素の合計の計算など、多くの単項演算は、 ndarray



クラスのメソッドとして表されます。

Copy Source | Copy HTML<br/>>>> a = random . random (( 2 , 3 ))<br/>>>> a<br/> array ([[ 0 . 6903007 , 0 . 39168346 , 0 . 16524769 ],<br/> [ 0 . 48819875 , 0 . 77188505 , 0 . 94792155 ]])<br/>>>> a. sum ()<br/> 3 . 4552372100521485 <br/>>>> a. min ()<br/> 0 . 16524768654743593 <br/>>>> a. max ()<br/> 0 . 9479215542670073 <br/>







デフォルトでは、これらの操作は、形状に関係なく、あたかも数字のリストであるかのように配列に適用されます。 ただし、 axis



パラメーターを指定することにより、配列の指定された軸に操作を適用できます。

Copy Source | Copy HTML<br/>>>> b = arange( 12 ).reshape( 3 , 4 )<br/>>>> b<br/> array ([[ 0 , 1 , 2 , 3 ],<br/> [ 4 , 5 , 6 , 7 ],<br/> [ 8 , 9 , 10 , 11 ]])<br/>>>><br/>>>> b. sum (axis= 0 ) # <br/> array ([ 12 , 15 , 18 , 21 ])<br/>>>><br/>>>> b. min (axis= 1 ) # <br/> array ([ 0 , 4 , 8 ])<br/>>>><br/>>>> b.cumsum(axis= 1 ) # <br/> array ([[ 0 , 1 , 3 , 6 ],<br/> [ 4 , 9 , 15 , 22 ],<br/> [ 8 , 17 , 27 , 38 ]]) <br/>







ユニバーサル機能



NumPyは、よく知られている数学関数sin、cos、expなどを使用した作業を提供します。 ただし、NumPyでは、これらの関数はユニバーサル( ufunc



)と呼ばれます。 このような名前を割り当てる理由は、NumPyではこれらの関数が配列も要素単位で機能し、出力は値の配列であるという事実にあります。

Copy Source | Copy HTML<br/>>>> B = arange( 3 )<br/>>>> B<br/> array ([ 0 , 1 , 2 ])<br/>>>> exp(B)<br/> array ([ 1 . , 2 . 71828183 , 7 . 3890561 ])<br/>>>> sqrt(B)<br/> array ([ 0 . , 1 . , 1 . 41421356 ])<br/>>>> C = array ([ 2 ., - 1 ., 4 .])<br/>>>> add(B, C)<br/> array ([ 2 ., 0 ., 6 .]) <br/>







インデックス、スライス、反復



1次元配列は、通常のリストや他のPythonシーケンスと非常によく似た方法で、インデックス付け、スライス、および反復操作を実行します。

Copy Source | Copy HTML<br/>>>> a = arange( 10 )** 3 <br/>>>> a<br/> array ([ 0 , 1 , 8 , 27 , 64 , 125 , 216 , 343 , 512 , 729 ])<br/>>>> a[ 2 ]<br/> 8 <br/>>>> a[ 2 : 5 ]<br/> array ([ 8 , 27 , 64 ])<br/>>>> a[: 6 : 2 ] = - 1000 # a <br/>>>> a<br/> array ([- 1000 , 1 , - 1000 , 27 . - 1000 , 125 , 216 , 343 , 512 , 729 ])<br/>>>> a[::- 1 ] # a <br/> array ([ 729 , 512 , 343 , 216 , 125 , - 1000 , 27 , - 1000 , 1 , - 1000 ])<br/>>>> for i in a:<br/>... print i**( 1 / 3 .),<br/>...<br/>nan 1 . 0 nan 3 . 0 nan 5 . 0 6 . 0 7 . 0 8 . 0 9 . 0 <br/>







多次元配列には、軸ごとに1つのインデックスがあります。 インデックスは、コンマで区切られた一連の数字として送信されます。

Copy Source | Copy HTML<br/>>>> def f (x,y):<br/>... return 10 *x+y<br/>...<br/>>>> b = fromfunction( f ,( 5 , 4 ),dtype=int)<br/>>>> b<br/> array ([[ 0 , 1 , 2 , 3 ],<br/> [ 10 , 11 , 12 , 13 ],<br/> [ 20 , 21 , 22 , 23 ],<br/> [ 30 , 31 , 32 , 33 ],<br/> [ 40 , 41 , 42 , 43 ]])<br/>>>> b[ 2 , 3 ]<br/> 23 <br/>>>> b[:, 1 ] # b <br/> array ([ 1 , 11 , 21 , 31 , 41 ])<br/>>>> b[ 1 : 3 ,:] # b <br/> array ([[ 10 , 11 , 12 , 13 ],<br/> [ 20 , 21 , 22 , 23 ]]) <br/>







Axesよりもインデックスの数が少ない場合、欠落しているインデックスはスライスによって補完されると想定されます。

Copy Source | Copy HTML<br/>>>> b[- 1 ] # . b[-1,:] <br/> array ([ 40 , 41 , 42 , 43 ]) <br/>







b[i]



b[i, < ':', >]



と読むことができます。 NumPyでは、これはb[i, ...]



ようなドットを使用して記述することもできb[i, ...]







たとえば、 x



のランクが5の場合(つまり、5つの軸がある場合)、



Copy Source | Copy HTML<br/>>>> c = array ( [ [[ 0 , 1 , 2 ], # 3d array <br/>... [ 10 , 12 , 13 ]],<br/>...<br/>... [[ 100 , 101 , 102 ],<br/>... [ 110 , 112 , 113 ]] ] )<br/>>>> c.shape<br/>( 2 , 2 , 3 )<br/>>>> c[ 1 ,...] # , c[1,:,:] c[1] <br/> array ([[ 100 , 101 , 102 ],<br/> [ 110 , 112 , 113 ]])<br/>>>> c[..., 2 ] # , c[:,:,2] <br/> array ([[ 2 , 13 ],<br/> [ 102 , 113 ]]) <br/>







多次元配列の反復は、最初の軸から始まります。

Copy Source | Copy HTML<br/>>>> for row in b:<br/>... print row<br/>...<br/>[ 0 1 2 3 ]<br/>[ 10 11 12 13 ]<br/>[ 20 21 22 23 ]<br/>[ 30 31 32 33 ]<br/>[ 40 41 42 43 ] <br/>







ただし、1次元であるかのように、要素ごとに配列要素全体を並べ替える必要がある場合は、このためにflat



属性を使用できます。

Copy Source | Copy HTML<br/>>>> for element in b.flat:<br/>... print element,<br/>...<br/> 0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43 <br/>







フォームでの操作



既に述べたように、配列は各軸に沿った要素の数によって決定される形状を持ちます。

Copy Source | Copy HTML<br/>>>> a = floor( 10 * random . random (( 3 , 4 )))<br/>>>> a<br/> array ([[ 7 ., 5 ., 9 ., 3 .],<br/> [ 7 ., 2 ., 7 ., 8 .],<br/> [ 6 ., 8 ., 3 ., 2 .]])<br/>>>> a.shape<br/>( 3 , 4 ) <br/>







配列の形状は、さまざまなコマンドを使用して変更できます。

Copy Source | Copy HTML<br/>>>> a.ravel() # <br/> array ([ 7 ., 5 ., 9 ., 3 ., 7 ., 2 ., 7 ., 8 ., 6 ., 8 ., 3 ., 2 .])<br/>>>> a.shape = ( 6 , 2 )<br/>>>> a.transpose()<br/> array ([[ 7 ., 9 ., 7 ., 7 ., 6 ., 3 .],<br/> [ 5 ., 3 ., 2 ., 8 ., 8 ., 2 .]]) <br/>







ravel()



関数の結果としての配列内の要素の順序は、通常の「Cスタイル」に対応します。つまり、インデックスが右に行くほど「速く変化」します。要素a[0,0]



a[0,1]



続きます。 配列の1つの形状が別の形状に変更された場合、配列は「Cスタイル」でも再形成されます。 通常、NumPyはこの順序で配列を作成するため、 ravel()



関数は通常、引数をコピーする必要はありませんが、配列が別の配列のスライスから作成された場合、コピーが必要になる場合があります。 ravel()



およびreshape()



関数は、(追加の引数を使用する場合)FORTRANスタイルでも機能します。このスタイルでは、左のインデックスがより速く変化します。



reshape()



関数は変更された形式で引数を返しますが、 resize()



メソッドは配列自体を変更します。

Copy Source | Copy HTML<br/>>>> a<br/> array ([[ 7 ., 5 .],<br/> [ 9 ., 3 .],<br/> [ 7 ., 2 .],<br/> [ 7 ., 8 .],<br/> [ 6 ., 8 .],<br/> [ 3 ., 2 .]])<br/>>>> a.resize(( 2 , 6 ))<br/>>>> a<br/> array ([[ 7 ., 5 ., 9 ., 3 ., 7 ., 2 .],<br/> [ 7 ., 8 ., 6 ., 8 ., 3 ., 2 .]]) <br/>







そのような再構築の操作中に、引数の1つが-1として指定されている場合、残りの引数に従って自動的に計算されます。

Copy Source | Copy HTML<br/>>>> a.reshape( 3 ,- 1 )<br/> array ([[ 7 ., 5 ., 9 ., 3 .],<br/> [ 7 ., 2 ., 7 ., 8 .],<br/> [ 6 ., 8 ., 3 ., 2 .]]) <br/>







配列結合



異なる軸に沿っていくつかの配列を組み合わせることができます。

Copy Source | Copy HTML<br/>>>> a = floor( 10 * random . random (( 2 , 2 )))<br/>>>> a<br/> array ([[ 1 ., 1 .],<br/> [ 5 ., 8 .]])<br/>>>> b = floor( 10 * random . random (( 2 , 2 )))<br/>>>> b<br/> array ([[ 3 ., 3 .],<br/> [ 6 ., 0 .]])<br/>>>> vstack((a,b))<br/> array ([[ 1 ., 1 .],<br/> [ 5 ., 8 .],<br/> [ 3 ., 3 .],<br/> [ 6 ., 0 .]])<br/>>>> hstack((a,b))<br/> array ([[ 1 ., 1 ., 3 ., 3 .],<br/> [ 5 ., 8 ., 6 ., 0 .]]) <br/>







column_stack()



関数は、1次元配列を2次元配列の列として結合します。

Copy Source | Copy HTML<br/>>>> column_stack((a,b))<br/> array ([[ 1 ., 1 ., 3 ., 3 .],<br/> [ 5 ., 8 ., 6 ., 0 .]])<br/>>>> a= array ([ 4 ., 2 .])<br/>>>> b= array ([ 2 ., 8 .])<br/>>>> a[:,newaxis] # 2D- <br/> array ([[ 4 .],<br/> [ 2 .]])<br/>>>> column_stack((a[:,newaxis],b[:,newaxis]))<br/> array ([[ 4 ., 2 .],<br/> [ 2 ., 8 .]])<br/>>>> vstack((a[:,newaxis],b[:,newaxis])) # vstack <br/> array ([[ 4 .],<br/> [ 2 .],<br/> [ 2 .],<br/> [ 8 .]]) <br/>







同様に、行にはrow_stack()



関数があります。 2つ以上の軸を持つ配列の場合、 hstack()



は最初の軸に沿って配列を結合し、 vstack()



-最後の軸に沿って、追加の引数により、結合が発生する軸の数を指定できます。



難しい場合には、 r_[]



および_[]



が役立ち、1つの軸に沿った数字のシーケンスを使用して1次元配列を作成できます。 また、「:」を使用してリテラルの範囲を指定する機能もあります。



Copy Source | Copy HTML<br/>>>> r_[ 1 : 4 , 0 , 4 ]<br/> array ([ 1 , 2 , 3 , 0 , 4 ]) <br/>







1つの配列をいくつかの小さな配列に分割する



hsplit()



を使用して、配列を水平軸に沿って分割し、同じ形状の返された配列の数または列番号のいずれかを指定してから、配列をハサミで切り取ります。

Copy Source | Copy HTML<br/>>>> a = floor( 10 * random . random (( 2 , 12 )))<br/>>>> a<br/> array ([[ 8 ., 8 ., 3 ., 9 ., 0 ., 4 ., 3 ., 0 ., 0 ., 6 ., 4 ., 4 .],<br/> [ 0 ., 3 ., 2 ., 9 ., 6 ., 0 ., 4 ., 5 ., 7 ., 5 ., 1 ., 4 .]])<br/>>>> hsplit(a, 3 ) # 3 <br/>[ array ([[ 8 ., 8 ., 3 ., 9 .],<br/> [ 0 ., 3 ., 2 ., 9 .]]), array ([[ 0 ., 4 ., 3 ., 0 .],<br/> [ 6 ., 0 ., 4 ., 5 .]]), array ([[ 0 ., 6 ., 4 ., 4 .],<br/> [ 7 ., 5 ., 1 ., 4 .]])]<br/>>>> hsplit(a,( 3 , 4 )) # a <br/>[ array ([[ 8 ., 8 ., 3 .],<br/> [ 0 ., 3 ., 2 .]]), array ([[ 9 .],<br/> [ 9 .]]), array ([[ 0 ., 4 ., 3 ., 0 ., 0 ., 6 ., 4 ., 4 .],<br/> [ 6 ., 0 ., 4 ., 5 ., 7 ., 5 ., 1 ., 4 .]])] <br/>





vsplit()



関数は、垂直軸に沿って配列を分割しますvsplit()



使用すると、分割が発生する軸を指定できます。



コピーと提出



配列を操作する場合、データを別の配列にコピーする必要がある場合とそうでない場合があります。 多くの場合、これは初心者の間で混乱の原因となります。 おそらく3つのケースだけです:



コピーなし



単純な割り当てでは、配列のコピーもそのデータのコピーも作成されません。

Copy Source | Copy HTML<br/>>>> a = arange( 12 )<br/>>>> b = a # <br/>>>> b is a # a b ndarray <br/>True<br/>>>> b.shape = 3 , 4 # a <br/>>>> a.shape<br/>( 3 , 4 ) <br/>







Pythonは可変オブジェクトをリンクとして渡すため、関数呼び出しもコピーを作成しません。

Copy Source | Copy HTML<br/>>>> def f (x):<br/>... print id (x)<br/>...<br/>>>> id (a)<br/> 148293216 <br/>>>> f (a)<br/> 148293216 <br/>







ビューまたはサーフェスコピー



異なる配列オブジェクトは同じデータを使用できます。 view()



メソッドは、同じデータの表現である新しい配列オブジェクトを作成します。



Copy Source | Copy HTML<br/>>>> c = a.view()<br/>>>> c is a<br/>False<br/>>>> c.base is a # c , a <br/>True<br/>>>> c.flags.owndata<br/>False<br/>>>><br/>>>> c.shape = 2 , 6 # <br/>>>> a.shape<br/>( 3 , 4 )<br/>>>> c[ 0 , 4 ] = 1234 # <br/>>>> a<br/> array ([[ 0 , 1 , 2 , 3 ],<br/> [ 1234 , 5 , 6 , 7 ],<br/> [ 8 , 9 , 10 , 11 ]]) <br/>







配列スライスは表現です:

Copy Source | Copy HTML<br/>>>> s = a[:, 1 : 3 ]<br/>>>> s[:] = 10 # s[:] s. s=10 s[:]=10 <br/>>>> a<br/> array ([[ 0 , 10 , 10 , 3 ],<br/> [ 1234 , 10 , 10 , 7 ],<br/> [ 8 , 10 , 10 , 11 ]]) <br/>







ディープコピー



copy()



メソッドは、配列とそのデータの実際のコピーを作成します。

Copy Source | Copy HTML<br/>>>> d = a. copy () # <br/>>>> d is a<br/>False<br/>>>> d.base is a # d <br/>False<br/>>>> d[ 0 , 0 ] = 9999 <br/>>>> a<br/> array ([[ 0 , 10 , 10 , 3 ],<br/> [ 1234 , 10 , 10 , 7 ],<br/> [ 8 , 10 , 10 , 11 ]]) <br/>







結論として



そのため、最初の部分では、配列を操作する上で最も重要な基本操作を調べました。 このパートに加えて、 良いチートシートをお勧めします。 2番目の部分では、より具体的なことについて説明します。インデックスの配列またはブール変数を使用したインデックス付け、線形代数演算とmatrix



クラスの実装、およびさまざまな便利なトリックです。



All Articles