Python研究ノート:NumPy入門

記事ディレクトリ

1つは、NumPyの概要です

NumPy(Numerical Python)は、Pythonのオープンソースの数値コンピューティング拡張機能です。このツールは、Python独自のネストリスト構造構造よりもはるかに効率的な大きな行列の保存と処理に使用できます。この構造は、行列の表現にも使用でき、多数の次元配列と行列操作をサポートします。さらに、アレイ操作用の多数の数学関数ライブラリも提供します。

NumPy配列は、Pythonの組み込みシーケンスよりもはるかに少ないメモリを使用し、配列操作はPythonのforループを必要とせず、もちろん計算効率も高くなります。
ここに写真の説明を挿入

2つの多次元配列オブジェクト

NumPyのndarrayは、大規模なPythonデータセットを格納するための高速で柔軟なコンテナです。NumPy配列操作は、Pythonスカラー操作に似ています。

  • 2行3列の2次元ランダム配列を作成します
    ここに写真の説明を挿入

  • ダブルス
    ここに写真の説明を挿入

  • 自己追加
    ここに写真の説明を挿入

  • 倍増操作を処理するためにPythonの2次元リストに変更すると、非常に面倒になります。デモは次のとおりです。
    ここに写真の説明を挿入

  • 上記から、2次元リストに2を掛けると、各要素を2倍にするのではなく、要素数が2倍になり、2行3列から4行3列に拡張され、最初の2行は最後の2行とまったく同じであることがわかります。 。

  • 正しいアプローチは次のとおりです。最初にネストされたリストの解析によって要素が2倍になった通常のリストを取得し、次に通常のリストを2次元のリストに変換します。
    ここに写真の説明を挿入

  • ndarrayは、同じタイプのデータの一般的な多次元コンテナです。つまり、アレイのすべての要素は同じタイプである必要があります。各配列には、各次元のサイズのタプルを表すshape属性と、配列のデータ型を記述するdtype属性があります。
    ここに写真の説明を挿入

3つ目は、NumPy多次元配列を作成する

1. array()関数を使用してNumPy配列を作成します

  • array()関数は、任意のシーケンスオブジェクトまたはその他の配列を受け入れます。

  • リストからNumPy1次元配列を作成します
    ここに写真の説明を挿入

  • ネストされたリストからNumPy2次元配列を作成します
    ここに写真の説明を挿入

  • ネストされたリストdata2によって生成される配列arr2は、3行4列の2次元配列です。関連情報は、shape、dtype、およびndim属性から取得できます。明示的に指定されていない限り、np.arrayは作成する配列のタイプを推測しようとします。データタイプはdtypeメタデータオブジェクトに保存されます。

ここに写真の説明を挿入

2.NumPy配列を作成するための他の関数

  • np.arrayの使用に加えて、0、1、空など、新しい配列を作成するための他の多くの関数があります。これらのメソッドを使用して、高次元の配列を作成し、タプルを渡して配列の形状を指定する必要があります。

(1)ゼロ関数を使用して、すべて0の要素を持つ配列を作成します

ここに写真の説明を挿入

(2)ones関数を使用して、1つの要素すべてを含む配列を作成します

ここに写真の説明を挿入

(3)空の関数を使用して配列を作成します

ここに写真の説明を挿入

  • np.emptyがすべて1またはすべて0の配列を返すと仮定すると、場合によっては、初期化されていないガベージ値が返されることがあります。

(4)arange関数は、Python組み込み関数範囲の配列値バージョンです。

ここに写真の説明を挿入

  • NumPyは数値計算に重点を置いています。指定されていない場合、整数のデフォルトタイプはint32であり、実数のデフォルトタイプはfloat64です。
    ここに写真の説明を挿入
  • もちろん、アレイの作成時に必要に応じてアレイタイプを指定できます
    ここに写真の説明を挿入

3.配列関数テーブルを作成します

ここに写真の説明を挿入

  • asarray()関数
    ここに写真の説明を挿入
  • zeros_like()与ones_like()関数数
    ここに写真の説明を挿入
  • full()関数
    ここに写真の説明を挿入
  • アイデンティティマトリックスの生成-eye()およびidentity()関数
    ここに写真の説明を挿入

4.配列要素のデータタイプ

ここに写真の説明を挿入

  • ndarray配列タイプはdtype属性に格納されます
    ここに写真の説明を挿入
  • float64、倍精度実数、8バイト、64ビット
  • float32、単一精度実数、4バイト、32ビット
    ここに写真の説明を挿入
  • タイプ変換デモ
    ここに写真の説明を挿入
  • もちろん、型変換が失敗することもあります
    ここに写真の説明を挿入

第四に、NumPyアレイの操作

NumPyアレイは、ユーザーがベクトル化と呼ぶforループなしでバッチデータ操作を実行できます。

1.アレイおよびアレイの算術演算

  • 算術演算は同じサイズの配列に対して実行され、対応する演算は要素ごとに実行されます。
    ここに写真の説明を挿入

2.配列とスカラーの算術演算

  • 配列と配列は4つの算術演算を実行できるだけでなく、配列とスカラーも4つの算術演算を実行できます
    ここに写真の説明を挿入

3.アレイとアレイ間の関係操作

  • アレイとアレイは、算術演算を実行できるだけでなく、リレーショナル演算も実行できます。
    ここに写真の説明を挿入

4.配列とスカラー間の関係操作

  • 配列やスカラーでさえ、リレーショナル操作を実行できます
    ここに写真の説明を挿入

5.放送の概要

  • 異なるサイズのアレイで実行される操作は、ブロードキャストと呼ばれます。

ここに写真の説明を挿入

5、基本的なインデックスとスライス

NumPy配列インデックス操作は豊富なトピックであり、配列のサブセットまたは単一の要素を選択するためのさまざまな方法があります。

1.NumPy一次元配列インデックスとスライス

  • NumPyの1次元配列のインデックス作成操作は非常に単純で、表面的にはPythonのリストインデックス作成操作に似ています。
    ここに写真の説明を挿入
  • NumPyでは、リストまたはスカラーをスライスに割り当てることができますが、Pythonのリストスライス(要素の数が1を超える)にスカラーを割り当てることはできません。
    ここに写真の説明を挿入
  • NumPyアレイとPythonリストのスライスには別の違いがあります。NumPyアレイスライスは元のアレイの「ビュー」であり、ビューの変更は元のアレイに反映されます。
    ここに写真の説明を挿入
    ここに写真の説明を挿入
  • 配列スライスの操作が元の配列に影響を与えないようにする場合は、copyメソッドを使用してスライスバックアップを生成できます。

ここに写真の説明を挿入

2. NumPy2次元配列インデックスとスライス

ここに写真の説明を挿入

  • 2次元配列の場合、単一のインデックスは、arr2d [1]によってアクセスされる2番目の行[1、4、9]などの1次元配列にアクセスします。
    ここに写真の説明を挿入
  • 2次元配列の要素にアクセスする方法は2つあります
    ここに写真の説明を挿入

6つの数学関数

  • 合計を追加
  • 差し引く
  • かける
  • 分割する
  • パワー
  • 残り
    ここに写真の説明を挿入

7つの統計関数

1.最大および最小関数-amax、amin

ここに写真の説明を挿入

2.最大ptpと最小ptpの差関数を見つけます

ここに写真の説明を挿入

3.統計的百分率関数-百分率

ここに写真の説明を挿入

4.中央関数と平均関数の平均

ここに写真の説明を挿入

5.加重平均関数-平均

ここに写真の説明を挿入

6.分散関数varおよび標準偏差関数std

ここに写真の説明を挿入

8、ソート機能-ソート

ここに写真の説明を挿入
ここに写真の説明を挿入
チームに5人の学生がいて、結果を次の表に示しているとします。NumPyを使用して、中国語、英語、および数学の平均、最小、最大、分散、および標準偏差をカウントします。次に、合計スコアに従って並べ替え、ランキングを取得して、スコアを出力します。
ここに写真の説明を挿入

  • プログラムの作成-StatisticResults.py
    ここに写真の説明を挿入
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 18:01:53 2020

@author: howard

统计成绩
"""

import numpy as np

stutype = np.dtype({
    
    
    'names': ['name', 'chinese', 'math', 'english'],
    'formats': ['S32', 'i', 'i', 'i', 'i']})

students = np.array([('mike', 95, 80, 78),
                     ('alice', 87, 90, 80),
                     ('green', 93, 78, 72),
                     ('brown', 89, 95, 84),
                     ('brian', 60, 90, 89)], dtype=stutype) 

chinese = students[:]['chinese']
math = students[:]['math']
english = students[:]['english']

def show(name, subject):
    print("{} | {:^6.2f} | {:^6.1f} | {:^6.1f} | {:^6.2f} | {:^6.2f}".format(name, np.mean(subject),
          np.amax(subject), np.amin(subject), np.var(subject), np.std(subject)))
    
print('科目 | 平均分 | 最高分 | 最低分 | 方差    | 标准差')
show('语文', chinese)
show('数学', math)
show('英语', english)   
print()

print("姓名 | 语文  | 数学 | 英语 | 总分")
rankings = sorted(students, key=lambda x: x[1]+x[2]+x[3])
for ranking in rankings:
    print("{:5s}|{:^6d}|{:^6d}|{:^6d}|{:^6d}".format(ranking['name'].decode('utf-8'), ranking['chinese'], ranking['math'], ranking['english'],
          ranking['chinese'] + ranking['math'] + ranking['english']))
  • プログラムを実行して結果を表示する
    ここに写真の説明を挿入
  • 単一の件名に従って並べ替える場合は、np.sortメソッドを直接使用してorder属性値を指定できます。
    ここに写真の説明を挿入
  • 数学スコアの昇順で実際にソートされていることがわかります:78、80、90、90、95
  • 数学のスコアを降順で並べ替える場合は、次のようにします。
    ここに写真の説明を挿入

9つの拡張演習

1.タスク:2次元ランダム配列の絶対値を取得します

方法1、条件付きスライスを使用

ここに写真の説明を挿入

方法2、np.abs()関数を使用する

ここに写真の説明を挿入

2.タスク:3つの変数で線形方程式のシステムを解きます

{x + 2 y + 3 z = 14(1)2 x − 4 y + z = − 3(2)3 x + 5 y − 2 z = 7(3)\ begin {cases} x + 2y + 3z = 14&(1)\\ 2x -4y + z = -3&(2)\\ 3x + 5y-2z = 7&(3)\ end {cases} バツ+2 Y+3 z=1 42 x4 Y+=33 x+5 Y2 z=71 2 3
ここに写真の説明を挿入

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 18:09:11 2020

@author: howard

求解三元一次方程组
"""

import numpy as np

A = np.array([[1, 2, 3],
              [2, -4, 1],
              [3, 5, -2]])
B = np.array([[14],
              [-3],
              [7]])

X = np.dot(np.linalg.inv(A), B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))
print()

X = np.linalg.inv(A).dot(B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))
print()

X = np.linalg.solve(A, B)
print('x1 = {:.2f}\nx2 = {:.2f}\nx3 = {:.2f}'.format(X[0, 0], X[1, 0], X[2, 0]))

おすすめ

転載: blog.csdn.net/howard2005/article/details/109216946