ベース6-numpy


今回のリリースでは、Pythonの科学処理パッケージnumpyに関する内容と方法をまとめました.

numpy


なぜnumpyを使うのですか?
  • は、非常に大きなマトリクス処理と複数の演算機能
  • を提供する.
  • は、文を繰り返すことなくデータアレイ
  • を処理する.
  • は、線形代数に関連する多くの機能
  • を提供する.
  • pythonはinterpriter言語であるため、リストは処理速度が遅いという欠点を補うことができる.
  • なぜスピードが速いのか
    1,numpyはC言語で実現されている
    2、numpyは1つのタスクをサブタスクとして並列処理する
    3、メモリアクセス方式によって速度が速い(メモリにはアドレス値ではなく実際の値が格納されているため、メモリの値は連続的に格納されているため、速度が速い).

    ソース
    https://checkwhoiam.tistory.com/94
  • と一般リストの違い
  • numpyは、1つのデータ型のみを配列(ダイナミックタイプはサポートされていない)
  • に入れることができる.
  • C言語のArrayを使用してアレイ
  • を作成
  • numpyメモリ構造

    ソース
    https://www.slideshare.net/enthought/numpy-talk-at-siam
  • numpyの使い方と特性

  • fi番号宣言とインデックスは
  • に近い.
    # 넘파이는 하나의 데이터 타입만 배열에 넣을 수 있음(dynamic typing 지원하지 않음)
    m = np.array([1,2,3,4], float)
    print(m)
    print(m[2]) #3출력
    #실수형변환이 가능한 것은 변환이 되어 배열 생성
    a = np.array(['1','2',3,4], float)
    
    print(a)
    print(type(a[0])) 
  • のメモリ直接値を超えるため、同じ整数値でもlistとは異なる結果が「is」構文で生成されます.
    a = [1,2,3,4,5]
    b = [1,2,3,4,5]
    print(a[0] is b[0]) #True
    
    a = np.array(a)
    b = np.array(b)
    print(a[0] is b[0]) # False

    handling shape

  • データ形状タイプ
  • 0次元:スカラー(7)
  • 次元:ベクトル([1,1])
  • 二次元:行列([1,1],[2,2])
  • 三次元:3‐テンソル([[1,2,3],[4,5,6],[7,8,9],[10,11,12])
  • ]
  • n次元:n-テンソル
  • 形状:戻り次元、dtype:戻りデータ型
  • #scalar
    t_arr = np.array([1,2,3,4], float)
    print(t_arr.dtype) #float64
    print(t_arr.shape)  #(4,)
    
    #matrix
    t_arr = np.array([[1,2,3],[4,5,6]], float)
    print(t_arr.shape) #(2,3)
    
    #3-tensor
    t_arr = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]], float)
    print(t_arr.shape) #(2,2,3)
  • ndim:次元数、size:データ量
  • t_arr = np.array([[1,2,3],[4,5,6],[4,5,6]], float)
    print(t_arr.ndim) #2 (2차원)
    print(t_arr.size) #9 (데이터의 갯수)
    
    t_arr = np.array([1,2,3,4], dtype = np.float32) # 32비트로 2진수로 표현
    print(type(t_arr[0]))
    
    t_arr = np.array([1,2,3,4], dtype = np.float64) # 64비트로 2진수로 표현
    print(type(t_arr[0]))
    
    t_arr = np.array([1,2,3,4], dtype = np.int)
    print(type(t_arr[0]))
  • nbyte:ndarrayオブジェクトのメモリサイズは
  • を返します.
    t_arr = np.array([1,2,3,4], dtype = np.float32) 
    print(t_arr.nbytes) #16 (4*4)
    
    t_arr = np.array([1,2,3,4], dtype = np.float64) 
    print(t_arr.nbytes) #32 (8*4)
    
    t_arr = np.array([1,2,3,4], dtype = np.int8)
    print(t_arr.nbytes) #4 (1*4)
    
    t_arr = np.array([1], dtype = np.int8) #얼마만큼 메모리 사용하고 있는지(int8은 1바이트)
    print(t_arr.nbytes) #1 (1*1)

    C言語のデータ型との互換性
    ソース
    https://kongdols-room.tistory.com/53
  • リモデリング:Arrayシェイプのサイズを変更し、要素の数は同じ
  • です.
    t_matrix = [[1, 2, 3], [4,5,6]]
    np.array(t_matrix).shape
    
    np.array(t_matrix).reshape(3, 2) # 형변환 가능
    #-1 : size 기반으로 크기를 알아서 선정해서 reshape해준다.
    t_matrix = [[1, 2, 3], [4,5,6]]
    print(np.array(t_matrix).reshape(-1, 2)) # 자체 내용이 바뀌지는 않고 return
    print("=============")
    print(np.array(t_matrix).reshape(3,-1))
    print("=============")
    print(test_matrix)
    
    t_matrix = [[1, 2, 3,4], [5,6,7,8]]
    print("=============")
    print(np.array(t_matrix).reshape(1,-1,2))
    print(np.array(t_matrix).reshape(1,-1,2).shape)
  • 扁平化:多次元配列を1次元配列に変換する
  • test_matrix = np.array([[1, 2, 3,4], [5,6,7,8]])
    print(test_matrix.flatten()) #[1 2 3 4 5 6 7 8]
    print(test_matrix.flatten().shape) #(8,)
    print(test_matrix.flatten().size) #8

    indexing & slicing

  • [0,0]記号使用可能-listとの違い
    より柔軟なスライド
  • a = np.array([[1,2,3], [4.1,5.1,6.1]], int)
    
    print(a[0,0]) # 1
    print(a[0][0]) # 1
    
    # ndarray 값 변환 가능
    a[0,0] = 11
    a  = np.array([[1,2,3], [4,5,6]], int)
    
    print(a[:,2:])
    print("===========")
    print(a[:,-1]) #마지막 행 추출
    print("===========")
    print(a[1,1:3])
    print("===========")
    print(a[1:3])


    ソース
    https://www.slideshare.net/PyData/introduction-to-numpy

    create function

  • 規格の生成には、さまざまな柔軟な方法があります.
  • arange:値リストを生成するコマンド
  • 、範囲指定用
    print(np.arange(10))
    print(np.arange(0,10,0.6))
    print(np.arange(10).reshape(2,5))
  • 零点:0を満たす仕様
  • を作成する
    print(np.zeros(shape=(10,),dtype = np.int8))
    print(np.zeros((2,5)))
  • ones:1の生成
  • print(np.ones(shape = (10,), dtype = np.int8))
    print(np.ones((2,5)))
  • empty:形状のみが空の仕様(出力値がゴミ値)
  • を生成する.
    print(np.empty(shape=(20,), dtype=np.int8))
    print(np.empty((5, 5)))
  • something like:既存のカレンダーのシェイプを埋めるために0または1の値を返します.
  • zeros like:0は
  • を返します.
  • ones like:塗りつぶし1は
  • を返します.
    t_matrix = np.arange(30).reshape(5,6)
    print(np.ones_like(t_matrix,float))
    print(np.zeros_like(t_matrix,float))
    print(np.ones_like(t_matrix,int))
    print(np.zeros_like(t_matrix,int))
  • identity:単位行列
  • を作成する
    np.identity(n=3, dtype=np.int8)
    np.identity(4)

  • 個目:対角線が1のマトリクス、kパラメータを使用して1の開始インデックスを変更し、行と列数は
  • を指定できます.
    print(np.eye(3))
    print(np.eye(3,5,k=2))#k는 1의 시작 행을 정함
    print(np.eye(N=3, M=5, dtype = np.int8))
  • diag:対角行列の取値
  • m = np.arange(9).reshape(3,3)
    print(m)
    print("========")
    print(np.diag(m))
    
    print(m)
    print("========")
    np.diag(m, k =1)
    
    print(m)
    print("========")
    np.diag(m, k =0)
    
    print(m)
    print("========")
    np.diag(m, k =-1)




  • random sampling

  • 均一(Uniform):均一分布に基づく乱数を作成するには

  • normal:正規分布を生成する整数

  • 指数:指数分布を生成する乱数
  • np.random.uniform(0,1,10).reshape(3,2) #균등분포
    np.random.normal(0,1,6).reshape(3,2) # 정규분포
    np.random.exponential(scale = 3, size = 10) #지수분포

    operation function

  • sum:endarrayの要素間の関数
    axisを用いて基点を持って和を求めることができる.
  • a = np.arange(11)
    print(a.sum())
    print(a.sum(dtype = np.float64))

    行列の場合
    axis=0:行ベース
    axis=1:カラムベース
    a = np.arange(1,11).reshape(2,5)
    print(a)
    print(a.sum(axis = 0))
    print(a.sum(axis = 1))

    テンソルの場合
    a = np.arange(1,21).reshape(2,5,2)
    print(a)
    
    print(a.sum(axis = 0)) #(5,2)
    print("=========")
    print(a.sum(axis = 1)) #(2,2)
    print("=========")
    print(a.sum(axis = 2)) #(2,5)


    個人的なテクニック
    3−テンソル形状が(a,b,c)の場合、aixs=0はaを削除する(b,c)形状、aixs=1はbを削除する(a,c)形状、aixs=2はcを削除する(a,b)形状である.マトリクスも同様にshapeが(a,b)の場合、aixs=0はaを削除する(b,)形状であり、aixs=1はbを削除する(a,)形状であるべきである.
    平均値:
  • ,std:標準偏差,sqrt:平方根,exp:指数
    このほかにも、
  • という多くの数学関数があります.
    m = np.arange(10).reshape(2,5)
    print(m)
    
    print(m.mean())
    print("==========")
    print(m.mean(axis= 0))
    print("==========")
    print(m.mean(axis= 1))
    
    print(m.std())
    print("==========")
    print(m.std(axis= 0))
    print("==========")
    print(m.std(axis= 1))
    
    print(np.sqrt(m))
    print("==========")
    print(np.exp(m)) #e^m



  • カスケード:numpy arrayをマージする関数
  • a = np.array([1,2,3])
    b = np.array([2,3,4])
    np.vstack((a,b)) #위에서 아래로 쌓임
    a = np.array([[1],[2],[3]])
    b = np.array([[2],[3],[4]])
    np.hstack((a,b)) #왼쪽에서 오른쪽으로 쌓임

    カスケードを軸としてマトリクスをマージできます.
    a = np.array([[1,2,3]])
    b = np.array([[2,3,4]])
    np.concatenate((a,b),axis = 0)
    a = np.array([[1,2,3]])
    b = np.array([[2,3,4]])
    np.concatenate((a,b),axis = 1)
    a = np.array([[1,2], [3,4]])
    b = np.array([[5,6]])
    np.concatenate((a,b.T),axis = 1)
  • 次元を追加する2つの方法
    1, reshape()
    2, np.newaxis
  • a = np.array([[1,2], [3,4]])
    b = np.array([5,6])
    
    #축을 추가하는 2방법
    #1, b.reshape(-1,2)
    #2, b = b[np.newaxis,:]
    b = b[np.newaxis,:]
    np.concatenate((a,b.T),axis = 1)

    array operation

  • は基本的な4則演算
  • をサポートする.
    a = np.array([[1,2,3], [4,5,6]], float)
    b = np.array([[1,2,3], [4,5,6]], float)
    
    print(a + b)
    print(a - b)
    print(a * b)
  • 行列の乗点関数または"@"は
  • を使用します.
    a = np.array([[1,2,3], [4,5,6]], float)
    b = np.array([[1,2], [4,5],[5,6]], float)
    print(a.dot(b))
    print(a @ b)
  • フロントマトリクス
  • a = np.arange(10).reshape(2,5)
    print(a)
    print("=========")
    print(a.T)
    a = np.arange(20).reshape(2,5,2)
    print(a)
    print("=========")
    print(a.T)
  • ブロードキャスト:異なるシェイプアレイ間の演算をサポートします.
  • m = np.array([[1,2,3], [4,5,6]], float)
    scalar = 2
    
    print(m + scalar)
    print("============")
    print(m - scalar)
    print("============")
    print(m * scalar)
    print("============")
    print(m / scalar)
    a = np.array([[1,2,3], [4,5,6], [7,8,9]],int)
    b = np.array([10,11,12], int)
    
    print(a + b)
    print("============")
    print(a - b)
    print("============")
    print(a * b)
    print("============")
    print(a / b)
  • timeit:jupyter環境でコードのパフォーマンスをチェックする関数
    (通常速度はfor loop
    %timeit [scalar * value for value in range(1000000)]
    %timeit np.arange(1000000) * scalar

    comparisions

  • any:要素の一部が真の場合は真を返します.all:すべての要素が真の場合は真
  • を返します.
    a = np.arange(10)
    
    # array([ True,  True,  True,  True, False, False, False, False, False,
    #       False])
    a < 4
    
    # array([ True, False, False, False, False, False, False, False, False,
    #       False])
    a < 1
    
    np.all(a < 10) #True
    np.all(a < 5) # False
    np.any(a < 5) # True
    np.any(a > 11) # False
  • カレンダray間の比較可能:ブール型データを返すカレンダ
  • a = np.array([1,2,3], float)
    b = np.array([4,5,-1], float)
    
    # array([False, False,  True])
    a > b
    
    print((a > b).any()) # True
    print((a > b).all()) # False
    
    a = np.array([1,2,3], float)
    # array([ True,  True, False])
    np.logical_and(a>0,a<3)
    
    a = np.array([True,False,False], float)
    # array([False,  True,  True])
    np.logical_not(a)
    
    c = np.array([False,False,True], float)
    # array([ True, False,  True])
    np.logical_or(a,c)
  • where:条件を満たす値またはインデックス
  • を返します.
    a = np.array([1,2,3], float)
    # array([2, 2, 3]) <조건에 맞는 값 반환>
    np.where(a>2,3,2)
    
    a = np.arange(10)
    # (array([6, 7, 8, 9]),) <인덱스 반환>
    np.where(a>5)
    
    a = np.array([1,np.NaN,np.Inf], float)
    # array([False,  True, False])
    np.isnan(a)# Not a Number
    
    # array([ True, False, False])
    np.isfinite(a) # is finite number(유한한 수인가? , 머신러닝 할 경우 발산하는 값을 걸러낼 때 주로 사용)
  • argmax,argmin:配列内の最大値または最小値を返すインデックス
  • a = np.array([1,2,3,4,5,6,7,8,9])
    print(np.argmax(a)) # 8
    print(np.argmin(a)) # 0
    
    a = np.array([[1,7,32],[43,1,4]])
    print(np.argmax(a,axis = 1)) # [2 0]
    print(np.argmin(a,axis = 0)) # [0 1 1]
  • argsort:数値をソートし、対応するインデックス
  • を抽出する.
    a = np.array([1,2,5,6,7,8,9,4,2,1])
    # array([0, 9, 1, 8, 7, 2, 3, 4, 5, 6])
    a.argsort()

    boolean index & fancy index

  • boolean index:特定の条件に従って配列形式で値
  • を抽出する
    a = np.array([1,2,5,6,7,8,9,4,2,1])
    # array([False, False,  True,  True,  True,  True,  True,  True, False,
    #       False])
    a > 3
    
    condition = a < 3 #조건은 판단하는 ndarray shape와 동일
    a[condition] # array([1, 2, 2, 1])
  • フラワーインデックス:arrayをインデックス値として使用して
  • を抽出
    a = np.array([2,4,6,8],float)
    b = np.array([0,0,1,3,2,1],int) # 반드시 integer로 선언(shape이 같은 필요는 없음)
    a[b] #array([2., 2., 4., 8., 6., 4.])
    
    a.take(b) #take 함수 : fancy index와 같은 효과
    a = np.array([[1,2], [3,4]], float)
    b = np.array([0,1,1,1,0], int)
    c = np.array([0,1,1,0,1], int)
    
    print(a)
    print("=========")
    print(a[b,c])
    print("=========")
    print(a[b])

    ファイルI/O

  • np.loadtxt(ファイルを読み込む)、
    np.savetxt(ファイルを保存)、
    np.numpyオブジェクトの保存-npyファイルを使用します.
    np.load(numpyオブジェクト読み出し-npyファイル)などの関数が存在する
    (npyファイル-pickle(オブジェクトストレージ)と同じストレージフォーマット)
  • Reference


    Naver BoostCap AI技術と課程
    https://m.blog.naver.com/PostView.nhn?blogId=acornedu&logNo=220934409189&proxyReferer=https:%2F%2Fwww.google.com%2F
    https://checkwhoiam.tistory.com/94
    https://codetorial.net/articles/exponential_distribution.html