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 都能提供高效且易于使用的解决方案。掌握了这些基础知识后,你就可以在更复杂的数据分析和科学计算任务中运用这些技能了。