《Numpy 简易速速上手小册》第1章:Numpy 基础(2024 最新版)

《Numpy 简易速速上手小册》第1章:Numpy 基础(2024 最新版)_第1张图片

文章目录

  • 1.1 创建和操作 Numpy 数组
    • 1.1.1 基础知识
    • 1.1.2 完整案例:多维数据分析
    • 1.1.3 拓展案例 1:时间序列数据
    • 1.1.4 拓展案例 2:图像数据处理
  • 1.2 数组的索引和切片
    • 1.2.1 基础知识
    • 1.2.2 完整案例:时间序列分析
    • 1.2.3 拓展案例 1:多维数据访问
    • 1.2.4 拓展案例 2:多条件筛选
  • 1.3 数学运算基础
    • 1.3.1 基础知识
    • 1.3.2 完整案例:数据标准化
    • 1.3.3 拓展案例 1:二维数组的运算
    • 1.3.4 拓展案例 2:矩阵运算

1.1 创建和操作 Numpy 数组

1.1.1 基础知识

欢迎踏入 Numpy 数组的世界!首先,让我们了解一下 Numpy 数组的基础。Numpy 数组,也称为 ndarray,是 Python 中用于存储和处理大型数据集的核心。它们比 Python 原生的列表更快、更强大。在 Numpy 中,我们主要处理同质数据类型,这就是 Numpy 高效的秘密之一。

数组可以有不同的维度:一维数组像列表,二维数组像矩阵,更高维度的数组在数据科学中也非常常见。创建数组最简单的方法是使用 np.array() 函数,并传递一个列表或列表的列表作为参数。

1.1.2 完整案例:多维数据分析

假设你是一名数据科学家,需要分析一组三维数据。我们的数据集是一个三维数组,每个维度代表一个不同的属性。

import numpy as np

# 创建一个三维 Numpy 数组
data = np.array([
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
    [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
    [[19, 20, 21], [22, 23, 24], [25, 26, 27]]
])

# 计算所有元素的总和
total_sum = data.sum()
print("Total Sum:", total_sum)

# 计算第二维度的平均值
mean_dim2 = data.mean(axis=1)
print("Mean along the second dimension:\n", mean_dim2)

在这个案例中,我们首先创建了一个三维数组。接着,我们使用 sum() 方法计算了整个数组的总和,然后使用 mean() 方法沿着第二个维度(记住,维度是从 0 开始计数的)计算平均值。

1.1.3 拓展案例 1:时间序列数据

现在,假设你有一组时间序列数据,记录了一周每天的最高温度和最低温度。我们将使用 Numpy 来分析这些数据。

# 一周的最高温度和最低温度
temperatures = np.array([
    [30, 20],  # 周一
    [31, 21],  # 周二
    [32, 22],  # 周三
    [33, 23],  # 周四
    [34, 24],  # 周五
    [35, 25],  # 周六
    [36, 26]   # 周日
])

# 计算每天的温差
daily_temp_range = temperatures[:, 0] - temperatures[:, 1]
print("Daily Temperature Range:", daily_temp_range)

# 计算整周的平均最高温度
avg_high = temperatures[:, 0].mean()
print("Average High:", avg_high)

在这个案例中,我们创建了一个二维数组来存储一周的温度数据。然后,我们计算了每天的温差和整周的平均最高温度。

1.1.4 拓展案例 2:图像数据处理

最后,让我们看一个更高级的例子:图像数据处理。图像可以表示为三维 Numpy 数组,其中的维度分别代表高度、宽度和颜色通道。

# 假设我们有一个 64x64 像素的RGB图像
image = np.random.randint(0, 256, (64, 64, 3))

# 将图像转换为灰度
gray_image = np.mean(image, axis=2)
print("Grayscale Image Shape:", gray_image.shape)

在这个案例中,我们模拟了一个 64x64 像素的 RGB 图像

(使用随机数生成)。每个像素有三个颜色通道(红色、绿色和蓝色)。我们通过计算三个颜色通道的平均值将图像转换为灰度。

这三个案例展示了 Numpy 数组在不同应用场景中的强大功能。从基础的数组操作到复杂的数据分析和图像处理,Numpy 都是处理和分析数据的有力工具。随着你的进一步探索,你将发现更多令人兴奋的使用方式!


1.2 数组的索引和切片

1.2.1 基础知识

在 Numpy 数组的世界里,索引和切片是获取和操作数据的核心技巧。就像在 Python 列表中一样,你可以通过索引访问数组中的特定元素。不过,Numpy 带来了更多的功能,特别是在处理多维数组时。

索引(Indexing):它允许你访问数组的单个元素。比如,array[2, 3] 会访问第三行第四列的元素(因为索引从0开始)。

切片(Slicing):它提供了获取数组子集的方法。切片使用冒号 : 符号,比如 array[1:4, 0:2] 将选取第二到第四行和第一到第二列的元素。

布尔索引(Boolean Indexing):这是一种高级索引方式,允许你根据条件选择数组中的元素。

1.2.2 完整案例:时间序列分析

假设你是一名数据分析师,需要从一组存储在 Numpy 数组中的时间序列数据中提取特定的信息。这组数据记录了一段时间内每天的股市开盘价。

import numpy as np

# 10天的股市开盘价
stock_prices = np.array([120, 122, 121, 123, 124, 123, 125, 126, 127, 128])

# 获取第五天的股价
day_5_price = stock_prices[4]
print("Day 5 price:", day_5_price)

# 获取第三天到第七天的股价
week_prices = stock_prices[2:7]
print("Prices from day 3 to 7:", week_prices)

# 假设我们想找出价格超过125的日子
high_price_days = stock_prices > 125
print("Days with price over 125:", stock_prices[high_price_days])

这个案例中,我们首先访问了特定的一天的股价,然后通过切片获取了一个时间段内的股价,最后使用了布尔索引来找出特定条件下的数据。

1.2.3 拓展案例 1:多维数据访问

让我们假设你现在有一个二维的数据集,表示的是一个班级中学生在不同科目的分数。

# 5名学生在3门科目上的分数
scores = np.array([
    [88, 92, 80],
    [87, 90, 78],
    [95, 85, 88],
    [90, 90, 92],
    [85, 87, 85]
])

# 访问第三个学生的数学分数(第三列)
math_score_student_3 = scores[2, 2]
print("Math score of student 3:", math_score_student_3)

# 获取前三个学生的英语和数学分数
english_math_scores = scores[0:3, 0:2]
print("English and Math scores of first three students:\n", english_math_scores)

在这个案例中,我们处理了一个二维数组,首先访问了特定学生的特定科目分数,然后通过切片获取了部分学生在两门科目上的分数。

1.2.4 拓展案例 2:多条件筛选

假设你在处理一组关于房地产的数据,需要根据多个条件筛选房源。

# 假设数组中的每行代表一处房产,列分别是:价格(万元)、面积(平方米)、卧室数量
properties = np.array([
    [300, 70, 2],
    [400, 80, 3],
    [500, 90, 3],
    [600, 100, 4],
    [700, 110, 4]
])

# 找出价格小于600万且

卧室数量不少于3的房产
affordable_properties = properties[(properties[:, 0] < 600) & (properties[:, 2] >= 3)]
print("Affordable properties:\n", affordable_properties)

在这个案例中,我们使用了布尔索引和逻辑运算符来实现多条件筛选。这种方式在处理复杂数据集时非常有用,可以帮助我们快速找到符合特定条件的数据子集。

通过这些案例,你可以看到 Numpy 在数组索引和切片方面的强大功能。无论是单条件还是多条件筛选,一维还是多维数组,Numpy 都为数据的获取和操作提供了灵活而强大的工具。随着你不断深入学习,你将能够解锁更多数据处理的秘密!


1.3 数学运算基础

1.3.1 基础知识

Numpy 为数值计算提供了一个强大且高效的平台。它支持各种数学运算,包括但不限于基本的算术运算、统计运算、线性代数运算等。在 Numpy 中,这些运算通常是元素级别的,意味着它们将对数组中的每个元素单独应用。

基本算术运算:包括加法(+)、减法(-)、乘法(*)和除法(/)。这些运算可以直接应用于数组。

统计运算:如求和(sum)、求平均值(mean)、最大值(max)和最小值(min)等,这些都是分析数据集时常用的运算。

线性代数运算:Numpy 支持多种线性代数运算,如矩阵乘法、矩阵转置、求逆等。

1.3.2 完整案例:数据标准化

数据标准化是数据预处理中的一个重要步骤。假设你有一组数值数据,你需要将其标准化,使均值为 0,标准差为 1。

import numpy as np

# 假设有一组数据
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 计算均值和标准差
mean = data.mean()
std = data.std()

# 执行标准化
normalized_data = (data - mean) / std
print("Normalized Data:", normalized_data)

在这个例子中,我们首先计算了数据的均值和标准差,然后使用这些统计数据将原始数据标准化。

1.3.3 拓展案例 1:二维数组的运算

考虑一个场景,你需要处理一个二维数据集,比如一组学生的多门科目成绩,并计算每门科目的平均分。

# 5名学生的3门科目分数
scores = np.array([
    [70, 80, 90],
    [88, 78, 92],
    [85, 87, 91],
    [90, 91, 89],
    [95, 92, 88]
])

# 计算每门科目的平均分
subject_means = scores.mean(axis=0)
print("Average scores per subject:", subject_means)

在这个案例中,我们计算了每门科目(每列)的平均分数,使用了 axis=0 来指定沿着行的方向(即跨列)进行运算。

1.3.4 拓展案例 2:矩阵运算

假设你在处理一些线性代数问题,需要计算矩阵的逆或执行矩阵乘法。

# 创建一个矩阵
A = np.array([
    [1, 2],
    [3, 4]
])

# 计算矩阵的逆
A_inv = np.linalg.inv(A)
print("Inverse of Matrix A:\n", A_inv)

# 创建另一个矩阵
B = np.array([
    [2, 0],
    [0, 2]
])

# 执行矩阵乘法
product = np.dot(A, B)
print("Product of A and B:\n", product)

这个案例展示了如何计算一个矩阵的逆,以及如何执行两个矩阵之间的乘法。这些操作在科学和工程计算中非常重要。

通过这些案例,你可以看到 Numpy 在数学运算方面的能力。从简单的数组操作到复杂的线性代数问题,Numpy 都能提供高效且易于使用的解决方案。掌握了这些基础知识后,你就可以在更复杂的数据分析和科学计算任务中运用这些技能了。

你可能感兴趣的:(《Numpy,简易速速上手小册》,numpy)