Python Numpyライブラリの一般的な使い方入門チュートリアル

7507 ワード

この例では、Python Numpyライブラリの一般的な使い方について説明します.皆さんの参考にしてください.具体的には以下の通りです.
1、紹介
Numpyは、形状操作、ソート、選択、入出力、離散フーリエ変換、基本線形代数、基本統計演算、ランダムシミュレーションなど、配列を迅速に操作できる一般的なPython科学技術ライブラリです.多くのPythonライブラリや科学計算のパッケージでは、操作対象としてNumpy配列を使用したり、転送されたPython配列をNumpy配列に変換したりするため、Pythonでは操作データがNumpyから離れられません.
Numpyのコアはndarrayオブジェクトであり、Pythonのn次元配列でカプセル化されているが、C言語で関連する配列操作をプリコンパイルすることで、元のPythonよりも実行効率が高いが、Python言語で符号化され、簡潔なコードと効率的な実行速度を同時に持つ.ndarryと配列にはいくつかの違いがあります.numpy配列の要素は同じタイプで、Python配列オブジェクトが動的に成長できるのとは異なり、作成時に固定されたサイズが決定されます.
2、配列オブジェクト
2.1、属性
Numpyオブジェクトの形式は同構造の多次元配列であり、配列の次元は軸(axis)と呼ばれ、各次元の要素の個数は軸の長さと呼ばれます.例えば次は2×3の2次元配列arrは、第1軸長が3、第2軸長が2

arr = [[ 1., 0., 0.],
    [ 0., 1., 2.]]

arr配列オブジェクトでよく使用されるプロパティは次のとおりです.

#       
arr.ndim
#        ,  2×3    shape (2, 3)
arr.shape
#         
arr.size
#           
arr.dtype
#           
arr.itemsize

2.2、配列の作成
通常のpython配列をarray()メソッドでラップしてnumpy配列に変換し、dtype=所定の要素のデータ型を通過することができます.配列は、2 Dなどの高次元配列であってもよいし、メタグループの形式であってもよい.
既知のサイズの配列を塗りつぶす必要がある場合は、関数zeros()を使用して要素を0に塗りつぶすか、ones()を1に塗りつぶすか、empty()をランダム数に塗りつぶすことができます.
arange(a,b,c)関数は、aからbまでc長毎に配列要素を生成するために使用される.linspace(a,b,c)関数は、aからbの間にc個の配列要素を生成するために使用される

#        numpy  
a1 = np.array([2, 3, 4], dtype=float)
print(a1)                  
#           numpy  
a2 = np.array([(1, 2, 3), (3, 4, 5)])
print(a2)
#  3×3    1  
a3 = np.ones((3, 3))
print(a3)
#  1 10,  2      
a4 = np.arange(1, 10, 2)
print(a4)
#  1 12    4   
a5 = np.linspace(1, 12, 4, dtype=int)
print(a5)
 
'''
       numpy  :
[2. 3. 4.]
    :
[[1 2 3]
 [3 4 5]]
 1    :
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
 1 10  2      :
[1 3 5 7 9]
 1 12    4   :
[ 1 4 8 12]
'''

2.3、配列操作
算術演算子はマトリクスに直接適用することができ、その結果、各要素に演算を適用し、例えばマトリクスA*Bは各要素に対応して乗算され、マトリクスの乗算には@記号が使用される

A = np.array([[1, 1],
       [0, 1]])
B = np.array([[2, 0],
       [3, 4]])
print(A * B)
print(A @ B)
 
'''
        :
[[2 0]
 [0 4]]
     :
[[5 4]
 [3 4]]
'''

numpyには、sum、最大値max、最小値minなどの配列全体に適用される関数があります.これらのパラメータで軸を指定した場合は、指定した軸に適用されます.
配列に適用される特定の要素、例えばsin、cos、exp、開方sqrtなどを求める関数もあります.これらの関数は通関数(ufunc)と呼ばれます.

a = np.array([[0, 1, 2, 3],
       [4, 5, 6, 7],
       [8, 9, 10, 11]])
print(a.max()) #        ,   11
print(a.sum(axis=0)) #       ,   :[12 15 18 21]
print(np.sqrt(a))  #          

numpyの配列はpythonのlistと同様にインデックス、スライス、反復操作を行うことができます.配列a[x]はアクセス配列aの下にxと表記された要素を表し、1次元配列a[x:y]はアクセス配列xからyの要素を表し、xを省略すると最初から始まり、yは最後まで省略される.a[x:y:a]は、xからyまでa要素ごとに値をとることを表し、aが負数であれば逆順序で値をとることを表す.

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(a[1:3]) #      1 3   :[1 2]
print(a[::-2]) #             :[9 7 5 3 1]

多次元配列の場合、インデックス間はカンマで区切られます.使用可能...いくつかの次元を省略することを表し、省略するとその次元のすべての出力とみなされ、例えばx[...,3]x[:,:,:,:,3]に等しい.
forループ反復によって配列が多く、その内容は低次元のサブ配列であり、各サブ要素を巡回する場合はflat属性を使用することができます.

a = np.array([[0, 1, 2, 3],
       [10, 11, 12, 13],
       [40, 41, 42, 43]])
#   a   ( )    ,   ( )   1~3
print(a[1:3, 0:3])
#       ,   2  
print(a[2, ...])
#     
for row in a:
  print(row)
#        
for item in a.flat:
  print(item)
 
'''
    1~3 :
[[10 11 12]
 [40 41 42]]
       :
[40 41 42 43]
    :
[0 1 2 3]
[10 11 12 13]
[40 41 42 43]
      :
0
1
2
......
41
42
43
'''

インデックスとして特定の数値を使用するほか、numpy配列をインデックスとして使用することもできます.例えば配列iを1次元配列aのインデックスとして用いてa[i]を出力する.配列iが多次元配列である場合、aから選択された要素はi配列の対応する位置に埋め込まれる

a = np.arange(12) ** 2
print(a)
i = np.array([1, 3, 5])
print(a[i])
#       j
j = np.array([[3, 4], [9, 7]])
print(a[j])
 
'''
[ 0  1  4  9 16 25 36 49 64 81 100 121]
  a 1、3、5   
[ 1 9 25]
      j  a         
[[ 9 16]
 [81 49]]
'''

aが多次元配列である場合、インデックス配列の単一要素は、選択された配列aの最初の次元を表す
多次元配列を複数の次元でインデックスすると、複数のインデックス配列i,jが入力され、カンマで区切られる

a = np.array(([[0, 1, 2, 3],
        [4, 5, 6, 7],
        [8, 9, 10, 11]]))
#           
i = np.array([0, 1])
print(a[i])
#             ,    i,j    a [0,2]、[1,3]    
j = np.array([2, 3])
print(a[i, j])
'''
      a  0、1  :
[[0 1 2 3]
 [4 5 6 7]]
a [0,2]、[1,3]    :
[2 7]
'''

2.4、次元の変更
配列のreshape()メソッドは、元の配列をターゲット次元の配列に再構成することができ、例えば1つの2×6の配列は3に再構成されています×4の配列、
配列は再構築時に元の配列を変更するのではなく、変更後の結果配列を返します.
配列は、再構築および印刷時に右端の次元から左に進み、例えば次の3×4の配列bは、まず行ごとに4つ並べてから改行し、このような3行を並べます.多次元の場合は、このような行列で出力を続けます.配列次元が-1の場合、12要素を含む配列などの次元のサイズが自動的に計算されます.2番目、3番目は3です.×2,1次元は2
ravel()関数は、配列を1次元配列に伸ばすことができます.

a=np.array([[1,2,3,4,5,6],
      [7,8,9,10,11,12]])
b=a.reshape(3,4)
print(b)
#     ,    
print(a.reshape(-1,3,2))
#     
flatted = b.ravel()
print(flatted, end=' ')
'''
[[ 1 2 3 4]
 [ 5 6 7 8]
 [ 9 10 11 12]]
2×3×2     :
[[[ 1 2]
 [ 3 4]
 [ 5 6]]

 [[ 7 8]
 [ 9 10]
 [11 12]]]
    :
[ 1 2 3 4 5 6 7 8 9 10 11 12] 
'''

numpyのhstack()関数は水平方向に複数の配列をマージでき、vstack()関数は垂直方向に複数の配列をマージできる
逆にhsplit()、vsplit()は、指定された数の配列に分割することができる

a=np.array([1,2,3])
b=np.array([4,5,6])
#       
c=np.vstack((a,b))
print(c)
#       
print(np.hstack((a,b)))
#       
print(np.hsplit(c,3))
'''
    
[[1 2 3]
 [4 5 6]]
    
[1 2 3 4 5 6]
       1×2 :
[array([[1],
    [4]]), 
array([[2],
    [5]]), 
array([[3],
    [6]])]
'''

2.5、配列の複製
配列オブジェクトが新しい変数に値を割り当てると、ストレージスペースが新しく開かれますか?それとも参照が渡されるだけですか?答えは引用です.
例えば、実行文b=aは、1つの参照をbに伝えるだけであり、bに対して実行される操作はaに直接影響する.a,bの2つのオブジェクトのノードidを表示するのも同様です

a = np.array([1, 2, 3])
b = a
#   b
b[0] = 0
print(a)
#   a、b   id
print(id(a), id(b))
 
'''
  b,a      
[0 2 3]
     id
2290013812656 2290013812656
'''

スライスで配列のビューを返すと、ビューの形状を変更しても元の配列には影響しませんが、ビューでデータの元の配列を変更しても変化します.del aを実行した後も、cがaを参照しているため、aはメモリから削除されません.

c = a[:]
#        
c.shape = 3, 1
print(c, a)
#     c   
c[0] = 1
print(a[0])
 
'''
   c      ,a      
[[0]
 [2]
 [3]] [0 2 3]
  c   ,a      :
1

copy()メソッドによりデータのコピーを生成できるため、コピーの操作は元の配列に全く影響しません.

d= a.copy()
d[0]=5
#        d,a    ,  a:[1 2 3]
print(a)

Pythonに関する詳細について興味のある読者は、「Python数学演算テクニックまとめ」、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python関数使用テクニックまとめ」、「Python文字列操作テクニックまとめ」、「Python入門と進級経典チュートリアル」、「Pythonファイルとディレクトリ操作テクニックまとめ」を参照してください.
ここではPythonプログラムの設計に役立つことを願っています.