【Pythonを使いこなす100日】53日目:Pythonデータ分析_NumPyデータの操作と分析の上級

目次

1.放送

 2 ファイル入出力

3 乱数生成

4 線形代数演算

 5 高度な操作

6 データ分析の


1.放送

        ブロードキャストは、異なる形状の配列間で要素ごとの操作を実行し、互換性のある形状にするための NumPy のメカニズムです。ブロードキャストを使用すると、データを明示的にコピーせずに、さまざまな形状の配列を操作できるようになります。異なる形状の配列を操作しようとすると、NumPy は要素ごとの操作に互換性のある形状になるように、それらの配列の形状を自動的に変更します。

ブロードキャストのルールと例: ブロードキャストのルールは次のとおりです。

  1. 2 つの配列の次元が異なる場合は、2 つの配列の次元が同じになるまで、小さい方の次元の配列の形状に 1 を加算します。
  2. 2 つの配列の形状が次元で一致しないが、一方の次元がサイズ 1 である場合、その次元はもう一方の次元と同じサイズに拡張されます。
  3. 2 つの配列のサイズがどの次元でも一致せず、どちらの次元もサイズ 1 でない場合、ブロードキャスト操作は失敗し、例外がスローされます。

例:

  • ブロードキャストのルールと例
import numpy as np

# 广播示例1:将标量与数组相乘
scalar = 2
array = np.array([1, 2, 3])
result = scalar * array
print("广播示例1结果:", result)  # 输出:[2 4 6]

# 广播示例2:将一维数组与二维数组相加
a = np.array([1, 2, 3])
b = np.array([[10, 20, 30], [40, 50, 60]])
result = a + b
print("广播示例2结果:\n", result)
# 输出:
# [[11 22 33]
#  [41 52 63]]

# 广播示例3:形状不兼容的情况
a = np.array([1, 2, 3])
b = np.array([10, 20])
try:
    result = a + b
except ValueError as e:
    print("广播示例3结果(异常):", e)
# 输出:广播示例3结果(异常):operands could not be broadcast together with shapes (3,) (2,)

 2 ファイル入出力

テキスト ファイルを読み取ります。

  • np.loadtxt(): テキスト ファイルからデータを読み取り、NumPy 配列を返すために使用されます。
  • np.genfromtxt(): テキスト ファイルからデータを読み取り、必要に応じて欠損値やデータ型を自動的に処理するために使用されます。

テキスト ファイルに書き込む:

  • np.savetxt(): NumPy 配列をテキスト ファイルに書き込むために使用されます。

バイナリ ファイルの読み取りと書き込み:

  • np.save(): NumPy 配列をバイナリ形式でディスク ファイルに保存します。
  • np.load(): 保存された NumPy 配列をディスク ファイルからロードします。

例:

import numpy as np

# 读取文本文件
data = np.loadtxt('data.txt')  # 从文本文件中读取数据

# 写入文本文件
np.savetxt('output.txt', data, delimiter=',')  # 将数据写入文本文件,使用逗号作为分隔符

# 读取和写入二进制文件
arr = np.array([1, 2, 3])
np.save('array_data.npy', arr)  # 保存数组到二进制文件
loaded_arr = np.load('array_data.npy')  # 从二进制文件中加载数组

3 乱数生成

乱数を生成します。

  • np.random.rand(): 一様に分布した乱数の配列を生成します。
  • np.random.randn(): 標準正規分布 (平均 0、標準偏差 1) から乱数の配列を生成します。
  • np.random.randint(): 指定された範囲内のランダムな整数を生成します。

ランダムシード:

  • np.random.seed(): 生成される乱数が再現可能であることを保証するために、乱数ジェネレーターのシードを設定するために使用されます。

例:

import numpy as np

# 生成随机数
random_numbers = np.random.rand(3, 3)  # 生成3x3的均匀分布的随机数数组
standard_normal = np.random.randn(2, 2)  # 生成2x2的标准正态分布的随机数数组
random_integers = np.random.randint(1, 10, size=(2, 3))  # 生成2x3的随机整数数组,范围在1到10之间

# 设置随机种子以可重复生成相同的随机数
np.random.seed(42)
random_a = np.random.rand(3)
np.random.seed(42)  # 使用相同的种子
random_b = np.random.rand(3)

        同じランダム シード値 (上記の例では 42) を使用すると、np.randomモジュールは同じ乱数シーケンスを生成します。これは再現可能なランダム性を保証するため、研究、実験、デバッグに役立ちます。例えば:

import numpy as np

np.random.seed(42)
random_a = np.random.rand(3)

# 使用相同的种子值生成相同的随机数序列
np.random.seed(42)
random_b = np.random.rand(3)

# random_a 和 random_b 应该是相同的
print(random_a)
print(random_b)

random_aこれにより、との値がrandom_b等しくなる        ように、同じ乱数のシーケンスが生成されます。

        異なる場所で同じシード値を使用すると、それらの場所で同じ乱数のシーケンスが生成されることに注意してください。ただし、シード値を変更すると、異なる乱数のシーケンスが生成されます。

        乱数の生成とランダム シードは、シミュレーション、機械学習の実験、再現性が必要なアプリケーションにおいて重要です。ランダム シードを使用すると、ランダム性に関係なく、実験結果が再現可能になります。

4 線形代数演算

        線形代数は科学計算において重要な役割を果たしており、NumPy は行列とベクトルを操作するための多くの線形代数演算を提供します。

  • 行列の乗算: np.dot(),@演算子
  • 逆行列と擬似逆行列: np.linalg.inv()np.linalg.pinv()
  • 固有値と固有ベクトル:np.linalg.eig()
  • 特異値分解 (SVD):np.linalg.svd()

行列乗算:np.dot()関数または演算子を使用して行列乗算を実行できます@

例:

import numpy as np

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

result = np.dot(A, B)  # 或者使用 result = A @ B

逆行列と擬似逆行列:np.linalg.inv()逆行列の計算と擬似逆行列の計算に使用できますnp.linalg.pinv()(行列が可逆でない場合は擬似逆行列を使用します)。

例:

import numpy as np

A = np.array([[1, 2], [3, 4]])
inverse_A = np.linalg.inv(A)
pseudo_inverse_A = np.linalg.pinv(A)

固有値と固有ベクトル:np.linalg.eig()行列の固有値と固有ベクトルを計算するために使用できます。

例:

import numpy as np

A = np.array([[1, 2], [2, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)

特異値分解 (SVD) :np.linalg.svd()特異値分解を使用して、行列を 3 つの行列の積に分解できます。

例:

import numpy as np

A = np.array([[1, 2], [3, 4], [5, 6]])
U, S, VT = np.linalg.svd(A)

 5 高度な操作

5.1 インデックス作成とスライス手法:

NumPy を使用すると、ブール マスク、整数配列のインデックス作成などの高度なインデックス作成テクニックを使用して、配列の要素にアクセスし、変更することができます。

  1. 基本的なスライス:

    • 基本的なスライスでは、開始インデックス、終了インデックス、ストライドを指定して配列の部分配列を抽出します。
    • 例:arr[2:5]要素の抽出にストライドを使用して、インデックス 2 ~ 4 のarr[1:5:2]要素を抽出します。
  2. ブール値マスキング:

    • ブール マスクを使用すると、何らかの条件 (通常はブール式) に基づいて配列内の要素を選択できます。
    • 例: arr[arr > 2]2 より大きい要素を選択します。
  3. 整数配列のインデックス付け:

    • 整数の配列をインデックスとして使用すると、配列内の要素を選択または再配置できます。
    • 例:arr[indices]整数の配列を使用すると、indices指定されたインデックスにある要素が選択されます。
  4. 多次元配列スライス:

    • 多次元配列をスライスする場合、さまざまな次元のスライス条件を指定できます。
    • 例:arr2[1:3, 0:2]行 2 と行 3 の最初の 2 列を選択します。

コード例:

import numpy as np

# 基本切片示例
arr = np.array([0, 1, 2, 3, 4, 5])
sub_array1 = arr[2:5]  # 提取子数组,结果为 [2, 3, 4]
sub_array2 = arr[1:5:2]  # 使用步长,结果为 [1, 3]

# 布尔掩码示例
mask = arr > 2
result = arr[mask]  # 选择大于2的元素,结果为 [3, 4, 5]

# 整数数组索引示例
indices = np.array([0, 2, 4])
result2 = arr[indices]  # 使用整数数组索引,结果为 [0, 2, 4]

# 多维数组切片示例
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
sub_array3 = arr2[1:3, 0:2]  # 选择第2和第3行的前2列
# 结果为
# [[4, 5],
#  [7, 8]]

# 输出结果
print("基本切片示例1:", sub_array1)
print("基本切片示例2:", sub_array2)
print("布尔掩码示例:", result)
print("整数数组索引示例:", result2)
print("多维数组切片示例:\n", sub_array3)

5.2 配列のソート

        NumPy は、配列をソートし、ソートされたインデックスを返すためのnp.sort()と を提供します。np.argsort()

例:

import numpy as np

arr = np.array([3, 1, 2, 4, 5])
sorted_arr = np.sort(arr)  # 对数组进行排序
sorted_indices = np.argsort(arr)  # 返回排序后的索引

例 1: 値による並べ替え

import numpy as np

arr = np.array([3, 1, 2, 4, 5])
sorted_arr = np.sort(arr)  # 按值升序排序,结果为[1, 2, 3, 4, 5]

 例 2: インデックスによる並べ替え

import numpy as np

arr = np.array([3, 1, 2, 4, 5])
indices = np.argsort(arr)  # 获取按值排序后的索引,结果为[1, 2, 0, 3, 4]
sorted_arr = arr[indices]  # 按索引排序,结果为[1, 2, 3, 4, 5]

5.3 構造化配列:

構造化配列を使用すると、データベース内のテーブルと同様に、さまざまなデータ型のデータを保存および操作できます。

例:

import numpy as np

data = np.array([(1, 'Alice', 25), (2, 'Bob', 30)],
                dtype=[('ID', 'i4'), ('Name', 'U10'), ('Age', 'i4')])

# 访问结构化数组的元素
print(data['Name'])  # 输出['Alice', 'Bob']

6 データ分析の例

学生のテストのスコアを含む CSV ファイルをロードし、平均スコア、スコアの分布を計算し、ヒストグラムを描画します。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 加载CSV文件数据
data = pd.read_csv('student_scores.csv')

# 提取分数列作为NumPy数组
scores = data['Score'].values

# 计算统计信息
mean_score = np.mean(scores)
median_score = np.median(scores)
std_deviation = np.std(scores)

# 绘制直方图
plt.hist(scores, bins=10, edgecolor='k', alpha=0.7)
plt.title('Score Distribution')
plt.xlabel('Score')
plt.ylabel('Frequency')
plt.show()

# 打印统计信息
print(f"Mean Score: {mean_score}")
print(f"Median Score: {median_score}")
print(f"Standard Deviation: {std_deviation}")

         この例では、まず Pandas ライブラリを使用して CSV ファイルをロードし、次にそこからスコア列を抽出して NumPy 配列に変換します。次に、NumPy を使用して平均、中央値、標準偏差を計算します。最後に、Matplotlib ライブラリを使用してスコアのヒストグラムをプロットしました。

        この例では、データの読み込み、統計の計算、データの視覚化など、より複雑なデータ分析タスクのために NumPy を他のライブラリとともに使用する方法を示します。

おすすめ

転載: blog.csdn.net/qq_35831906/article/details/132646943
おすすめ