Python和数据分析:Numpy新手指南

Numpy(Numerical Python的缩写)是一个用于处理多维数组和执行数学运算的强大库,对于Python中的数据科学和数值计算任务至关重要。本博客将专注于Numpy,为初学者提供一份详细的指南,这篇指南都将帮助你掌握Numpy的基础知识,使你能够轻松处理数组和进行数学运算。

  1. 导论:
    ======

1.1 Numpy在数据分析的重要性

  1. 高效的数组操作: Numpy提供了高效的数组对象(numpy.ndarray),它是一个多维数组,可以容纳相同类型的元素。这种数组的操作速度非常快,对于大规模数据集的处理非常高效。

  2. 数学运算和函数: Numpy包含了丰富的数学函数和运算符,使得在数组上进行各种数学运算变得轻松。这对于数据分析中的统计学、线性代数、概率等运算至关重要。

  3. 广播(Broadcasting): Numpy引入了广播机制,使得在不同形状的数组之间执行元素级操作变得更加灵活。这意味着你可以对形状不同的数组进行操作,而无需显式地扩展它们的形状。

  4. 内存优化: Numpy的数组在内存中是连续存储的,这使得对数组的访问和操作非常高效。此外,Numpy提供了C语 言级别的性能,使得对大规模数据的处理更为迅速。

1.2 Numpy在Python生态系统中的地位

Numpy是Python科学计算生态系统的基石,许多其他重要的数据科学和机器学习库都依赖于它。以下是Numpy在Python生态系统中的主要地位:

  1. 科学计算库的基础: 众多的科学计算库,如SciPy、pandas和scikit-learn等,都建立在Numpy的基础之上。Numpy提供了这些库所需的核心数据结构和算法。

  2. 机器学习和深度学习: 诸如TensorFlow和PyTorch等流行的机器学习和深度学习框架也使用Numpy数组作为它们的数据表示。Numpy的数组操作和性能是这些框架的关键支持。

  3. 可视化库支持: Matplotlib等可视化库通常能够直接处理Numpy数组,使得数据的可视化过程更为简便。

  4. Numpy基础:
    ===========

2.1 Numpy数组是什么?

Numpy数组是一种多维数组对象,用于存储和处理同一类型的元素。它是Numpy库的核心数据结构,具有以下特点:

  • 多维性: Numpy数组可以是一维、二维或多维的。一维数组类似于Python中的列表,而多维数组更适用于表示矩阵、图像等数据结构。

  • 同质性: 数组中的元素必须是相同类型的,这有助于提高数组的运算效率。

  • 固定大小: 一旦数组创建后,其大小就固定不变,不支持动态大小的操作。

2.2 数组的创建和基本操作

在Numpy中,可以使用以下方式创建数组:

import numpy as np# 从列表创建数组
arr_list = np.array([1, 2, 3, 4, 5])# 创建一个全零数组
arr_zeros = np.zeros((3, 3))# 创建一个全一数组
arr_ones = np.ones((2, 2))# 创建一个范围数组
arr_range = np.arange(0, 10, 2)# 创建一个等差数列数组
arr_linspace = np.linspace(0, 1, 5)# 随机创建一个数组
arr_random = np.random.rand(3, 3)

基本的数组操作包括:

  • 索引和切片: 通过索引和切片操作可以访问和修改数组的元素。
# 索引
element = arr_list[2]# 切片
subset = arr_range[1:4]
  • 形状变换: 可以使用reshape方法改变数组的形状。
arr_reshape = arr_range.reshape((2, 2))
  • 数组运算: 支持基本的数学运算,如加法、减法、乘法、除法等。
result = arr_ones + arr_zeros

2.3 数组的形状、类型和索引

  • 形状: 数组的形状描述了数组每个维度的大小。可以通过shape属性获取。
shape = arr_zeros.shape
  • 类型: 数组的数据类型可以通过dtype属性获取。
dtype = arr_range.dtype
  • 索引: 对于多维数组,可以使用逗号分隔的索引来访问元素。
element = arr_reshape[1, 0]

这些基础知识为使用Numpy进行数据分析奠定了基础。通过理解和掌握Numpy数组的创建、操作和基本特性,你将能够更有效地处理和分析数据。

  1. Numpy数学运算
    ============

3.1 数组间的数学运算

Numpy支持数组间的各种数学运算,包括加法、减法、乘法和除法等。这些运算是按元素进行的,即对应位置的元素相互操作。

import numpy as np# 数组间加法
result_add = array1 + array2# 数组间减法
result_subtract = array1 - array2# 数组间乘法
result_multiply = array1 * array2# 数组间除法
result_divide = array1 / array2

3.2 广播(Broadcasting)的概念和应用

广播是Numpy中一种强大的机制,它允许不同形状的数组进行运算,而不需要进行显式的形状匹配。广播的规则如下:

  • 如果两个数组的维度不同,那么小维度数组的形状将被补全,使其与大维度数组的形状相匹配。
  • 如果两个数组在某个维度上的大小是相同的,或者其中一个数组在该维度上的大小为1,那么它们在该维度上是兼容的。
  • 如果两个数组在所有维度上都是兼容的,它们可以一起使用广播。
import numpy as np# 使用广播进行数组运算
array1 = np.array([[1, 2, 3], [4, 5, 6]])
scalar = 2result = array1 + scalar

3.3 常用数学函数的使用

Numpy提供了丰富的数学函数,涵盖了从基本的三角函数到对数函数等各种数学运算。

import numpy as np# 常用数学函数
array = np.array([1, 2, 3])# 求平方根
sqrt_result = np.sqrt(array)# 求指数
exp_result = np.exp(array)# 对数运算
log_result = np.log(array)# 三角函数
sin_result = np.sin(array)

通过这些数学函数,你可以在Numpy中轻松执行各种数学运算,而无需编写复杂的循环或条件语句。

这些数学运算和函数使得Numpy成为处理科学计算和数据分析任务的强大工具,为数据科学家提供了丰富而高效的数学操作手段。

  1. 高级Numpy操作:
    =============

4.1 数组切片和索引技巧

Numpy提供了灵活的数组切片和索引操作,使得你可以按需获取数组的子集。

import numpy as np# 一维数组切片
arr = np.array([1, 2, 3, 4, 5])
subset = arr[1:4]# 多维数组切片
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
subset_2d = arr_2d[:2, 1:]# 使用布尔索引
bool_index = arr > 2
result = arr[bool_index]

4.2 数组形状的改变和调整

在Numpy中,你可以使用reshape方法改变数组的形状,或者使用flatten方法将多维数组转为一维数组。

import numpy as np# 改变数组形状
arr = np.array([[1, 2, 3], [4, 5, 6]])
reshaped_arr = arr.reshape((3, 2))# 将数组展平
flattened_arr = arr.flatten()

4.3 数组的合并和拆分

Numpy提供了多种方法进行数组的合并和拆分操作。

合并:

import numpy as np# 水平合并
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6]])
merged_horizontal = np.concatenate((arr1, arr2), axis=1)# 垂直合并
arr3 = np.array([[7], [8]])
merged_vertical = np.concatenate((arr1, arr3), axis=0)

拆分:

import numpy as np# 水平拆分
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
split_horizontal = np.split(arr, 2, axis=1)# 垂直拆分
split_vertical = np.split(arr, 2, axis=0)

这些高级Numpy操作让你能够更灵活地处理和操作数组,适应不同的数据结构和分析需求。通过熟练掌握这些技巧,你将能够更加高效地进行数据处理和分析。

  1. 实战案例:数据分析中的Numpy应用
    =====================

在实际数据分析项目中,Numpy经常被用于处理和操作真实的数据集。以下是一个简单的实战案例,演示了如何使用Numpy进行数据分析和数学运算。

5.1 数据集介绍

我们将使用一个模拟的学生成绩数据集,其中包含学生的姓名、学科和成绩。

import numpy as np# 模拟学生成绩数据集
students = np.array([    ["Alice", "Math", 90],["Bob", "Math", 75],["Alice", "English", 80],["Bob", "English", 85],["Charlie", "Math", 95],["Charlie", "English", 78]
])

5.2 任务1:计算每个学生的平均成绩

# 提取成绩列
grades = students[:, 2].astype(float)# 计算每个学生的平均成绩
average_grades = np.mean(grades)# 输出结果
print("平均成绩:", average_grades)

5.3 任务2:找出数学成绩最高的学生姓名

# 提取数学成绩
math_grades = grades[students[:, 1] == "Math"]# 找出数学成绩最高的学生姓名
top_math_student = students[np.argmax(math_grades), 0]# 输出结果
print("数学成绩最高的学生是:", top_math_student)

5.4 任务3:按学科计算平均成绩

# 提取学科列
subjects = students[:, 1]# 获取唯一学科
unique_subjects = np.unique(subjects)# 按学科计算平均成绩
for subject in unique_subjects:subject_grades = grades[subjects == subject]average_grade = np.mean(subject_grades)print(f"{subject}的平均成绩:{average_grade}")

通过这个简单的实战案例,我们演示了如何使用Numpy处理真实的学生成绩数据集,进行数学运算和数组操作。在实际项目中,这种数据处理和分析的方法可以更广泛地应用于各种类型的数据集。

  1. 性能优化和最佳实践:
    =============

6.1 Numpy性能优化的基本原则

在使用Numpy进行数据分析时,性能优化是一个重要的考虑因素。以下是一些基本原则:

  • 使用向量化操作: Numpy的向量化操作比使用循环逐元素操作要快得多。尽量利用Numpy的通用函数(ufuncs)来替代显式的循环。
# 非向量化操作
result = np.zeros_like(arr)
for i in range(len(arr)):result[i] = arr[i] * 2# 向量化操作
result = arr * 2
  • 合理使用Numpy内置函数: Numpy提供了许多高性能的内置函数,如np.sum()、np.mean()等,避免使用Python内置的sum()、mean()等函数。
# 使用Numpy内置函数
result = np.sum(arr)# 避免使用Python内置函数
result = sum(arr)  # 较慢
  • 利用Numpy的广播机制: 广播机制能够在不增加数组大小的情况下进行数组运算,提高性能和减少内存消耗。
# 避免使用循环进行广播
result = np.zeros_like(arr)
for i in range(len(arr)):result[i] = arr[i] + scalar# 使用广播
result = arr + scalar

6.2 避免常见的陷阱和错误

  • 不要频繁复制数组: 频繁复制数组会消耗大量内存和时间。尽量通过引用或使用in-place操作来避免不必要的复制。
# 不必要的复制
new_array = old_array.copy()# 使用引用
reference_array = old_array
  • 小心浮点数比较: 浮点数的精度有限,避免直接比较浮点数是否相等,使用适当的容差范围进行比较。
# 不推荐
if a == b:# 推荐
if np.allclose(a, b):
  • 选择合适的数据类型: 在创建数组时,选择适当的数据类型可以减小内存占用并提高性能。
# 选择合适的数据类型
arr = np.array([1, 2, 3], dtype=np.int16)

这些性能优化原则和最佳实践可以帮助你更有效地使用Numpy,提高代码的运行效率,特别是在处理大型数据集时。在实际项目中,理解这些原则对于确保代码高效运行至关重要。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/292211.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode做题总结 1. 两数之和

1. 两数之和 暴力法哈希法重新分析Java语法 暴力法 2023.09.20 刚开始用暴力法破解&#xff08;C&#xff09; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> a;for(int i0; i<nums.size()-1; i) {for(…

ros2 学习11-通信中动作的定义及自定义action 交互示例

机器人是一个复杂的智能系统&#xff0c;并不仅仅是键盘遥控运动、识别某个目标这么简单&#xff0c;我们需要实现的是送餐、送货、分拣等满足具体场景需求的机器人。 在这些应用功能的实现中&#xff0c;另外一种ROS通信机制也会被常常用到——那就是动作。从这个名字上就可以…

我的创作纪念日- 从第一天到今天

目录 机缘 收获 持续学习和探索新技术 深化现有知识 代码里有所有 日常 扩大影响力 维护创作的质量和一致性 反馈和自我反思 憧憬 在这平凡的一天里&#xff0c;我选择赋予它特殊的意义。这不仅仅是我的创作旅程的一个节点&#xff0c;更是我个人成长和技术进步的见证…

HEA---code

import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.animation import FuncAnimationfrom matplotlib.offsetbox import OffsetImage, AnnotationBbox# 创建一个画布和坐标轴对象 fig, ax plt.subplots() # 创建一个参数t&#xff0c;范围是0到2π t np.lins…

「工业遥测」图表控件LightningChart在水工业中的应用

LightningChart.NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学…

图像ISP处理——自动对焦AF算法

自动对焦算法是在数码相机、摄像机和其他图像采集设备中常见的技术之一&#xff0c;它通过调整镜头位置或其他光学参数来确保拍摄的图像在焦点上清晰。 以下是一些常见的自动对焦算法&#xff1a; 对比度检测对焦&#xff08;Contrast Detection Autofocus&#xff0c;CDAF&am…

表格实现合并单元格

实现的效果 一、列合并 此需求的列合并比较简单, 直接使用el-table-column包括即可 <el-table-column align"center" sortable label"目标"><el-table-column prop"target1" sortable label"预设目标" /><el-table-c…

4. 可用性

文章目录 4. 第4章 可用性4.1. 可用性一般场景4.2. 可用性策略故障检测&#xff08;Detect Faults&#xff09;故障恢复&#xff08;Recover from Faults &#xff09;故障预防&#xff08;Prevent Faults&#xff09; 4.3. 基于策略的可用性调查表4.4. 可用性模式4.5. 扩展阅读…

【pentaho】kettle读取Hive表不支持bigint和timstamp类型解决。

一、bigint类型 报错: Unable to get value BigNumber(16) from database resultset显示kettle认为此应该是decimal类型(kettle中是TYPE_BIGNUMBER或称BigNumber)&#xff0c;但实际hive数据库中是big类型。 修改kettle源码解决&#xff1a; kettle中java.sql.Types到kettle…

仓储1、10、11代电子标签接口文档

标签注册 仓储1代注册 侧面按钮连按三次&#xff0c; 注册成功&#xff1a;红灯变绿灯 仓储10代注册 右下角左下角组合按键触发注册 注册成功&#xff1a;右上角绿灯变红灯 仓储11代注册 磁体靠近条码附近&#xff0c;触发标签注册到系统 注册成功&#xff1a;闪红灯边绿…

Ubuntu20.04 及深度学习环境anaconda、cuda、cudnn、pytorch、paddle2.3安装记录

学习目标&#xff1a; Ubuntu20.04下装好torch、paddle深度学习环境。 选择的版本环境是 &#xff1a;最新的nvidia驱动、cuda 11.1 、cudnn v8.1.1&#xff0c;下面会说为啥这么选。 学习内容&#xff1a; 1. Ubuntu20.04仓库换源 本节参考Ubuntu 20.04 Linux更换源教程 2…

C/C++ 块作用域的静态变量static的应用

块作用域的静态变量 静态变量(static variable)听起来自相矛盾&#xff0c;像是一个不可变的变量。实际上&#xff0c;静态的意思是该变量在内存中原地不动&#xff0c;并不是说它的值不变。具有文件作用域的变量自动具有&#xff08;也必须是&#xff09;静态存储器。创建的具…