浅入浅出数据分析之Hello NumPy系列(二)

2023-10-29 04:30

本文主要是介绍浅入浅出数据分析之Hello NumPy系列(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2020,努力做一个无可替代的人!

作者 | 小一

202537d7c448d305baf520300ac44f59.png

全文共2823字,阅读全文需9分钟

写在前面的话

NumPy 第二小节,同学们自行复习前面的内容:

  • 事半功倍的Python高阶函数

  • 浅入浅出数据分析之 Hello NumPy(一)

高阶部分篇篇都是干货,建议大家不要错过任何一节内容

最好把公众号设为星标7b83a6b5c94250e805a9413333c1afe9.png,方便看到每次的文章推送。


正文

先想一个问题,NumPy 的核心是多维数组,List 也是数组,那是否它们的一些特性也是相同的呢?

List 特性是什么?又忘记了吧?

我直接贴前面文章的链接啦,注意仔细看:Python 列表与字符串高阶特性

你也先别急着回答前面的问题,带着问题继续往下看。

先看一维数组

首先,先创建一个一维数组:

# 创建一维数组
data_arr = np.arange(10)# 输出
[0 1 2 3 4 5 6 7 8 9]

0-9的一维数组,我们试着输出数组的后五位数

# 输出数组的后五位数
data_arr[-5:]
data_arr[5:10]# 输出
[5 6 7 8 9]
[5 6 7 8 9]

可以看到,和列表 List 一样,一维数组同样支持切片操作

不同的是,数组切片是原始数组的视图,视图上的任何修改都会直接反映到源数组上。

# 修改数组后五位数的值
data_arr[-5:] = 0
# 输出
[0 1 2 3 4 0 0 0 0 0]# 修改数组奇数位上的值为 -1
data_arr[::2] = -1
# 输出
[-1  1 -1  3 -1  0 -1  0 -1  0]

可以直接通过修改切片结果,也就是视图,从而达到修改源数组值的效果。

往下看,我们要找出数组值为 -1的所有元素

# 数组值为 -1的所有元素
data_arr == -1
data_arr[data_arr == -1]# 输出
[ True False  True False  True False  True False  True False]
[-1 -1 -1 -1 -1]

通过对 data_arr 进行比较运算输出一个布尔型数组,然后输出布尔值为 True 的结果。

当然这个例子比较牵强,输出的肯定都是 -1 啦。

换种比较方式,我们找出数组值大于 0 的所有元素

# 数组值大于 0 的所有元素
data_arr[data_arr > 0]# 输出
[1 3]

我们发现,数组支持布尔型索引

在进行数据分析时,布尔类型的数据筛选可以节省很多工作。

再来看多维数组

同样的先创建多维数组,这里用到的创建方法不同于上节介绍到的几种方式

同学们可以了解一下。

# 通过 randn 函数生成五行三列正态分布的随机数据
data_arr2d = np.random.randn(5, 3)# 输出
[[ 1.13042124 -1.6739234   0.53706167][-0.97661624 -0.27100353  0.00312314][-0.01815399 -1.11894791  0.54558887][-0.90802724  0.07955776 -0.26139345][-0.59722727 -0.54188117  1.1033876 ]]

random 函数还有 rand()、random()、randint() 等多种方法

我们这里通过 randn() 方法生成正态分布的随机数据。

和一维数组一样,我们试着进行切片操作

# 输出五行三列数据的第一行数据
data_arr2d[:1]
# 输出
[[ 1.13042124 -1.6739234   0.53706167]]# 输出五行三列数据的第二行第二列数据
data_arr2d[1:2, 1:2]
# 输出
[[-0.27100353]]# 输出五行三列数据的奇数行奇数列数据
data_arr2d[::2, ::2]
# 输出
[[ 1.13042124  0.53706167][-0.01815399  0.54558887][-0.59722727  1.1033876 ]]

可以看到,同一维数组切片一样,二维数组是在一维数组上再进行切片。

解释一下, :: 表示所有行, ::2 表示从第0行开始每隔2行取数

当然,我们也可以通过索引+切片的方式混合取值

# 输出五行三列数据的第二行的奇数列数据
data_arr2d[1, ::2]
# 输出
[-0.97661624  0.00312314]# 输出五行三列数据的奇数行的第二列数据
data_arr2d[::2, 1]
# 输出
[-1.6739234  -1.11894791 -0.54188117]

通过索引确定二维数组的行,然后通过切片确定列,也可以取到相应的值;反之,切片确定行、索引确定列同样适用。

注意:Python 中索引是从0开始计数(即第一行)

假设上面的五行三列数据分别代表【A,B,C,D,E】 的语文、数学、英语三科成绩,我们通过姓名数组对应起来

# 创建数组,表示【A,B,C,D,E】
name_arr = np.array(['A', 'B', 'C', 'D', 'E'])# 输出
['A' 'B' 'C' 'D' 'E']

这样的话,数据的行对应我们的【A,B,C,D,E】,数据的列对应语文、数学、英语三科成绩。

我们试着输出 C 的三科成绩

通过 name_arr 确定行,输出所有列的值

# C 的三科成绩
data_arr2d[name_arr == 'C']# 输出
[[-0.01815399 -1.11894791  0.54558887]]

再试着输出 A、C、D、E 的三科成绩

通过 name_arr 确定 A、C、D、E 的行,输出所有列的值。
这里可以通过取反,即 非B 的所有行

# A、C、D、E 的三科成绩
data_arr2d[name_arr != 'B']
# A、C、D、E 的三科成绩
data_arr2d[~(name_arr == 'B')]# 输出
[[ 1.13042124 -1.6739234   0.53706167][-0.01815399 -1.11894791  0.54558887][-0.90802724  0.07955776 -0.26139345][-0.59722727 -0.54188117  1.1033876 ]]

可以发现,两种表达方式都可,既可以使用 不等于符号 (!=),也可以通过波浪号 (~) 进行取反操作

需要注意的是,Python 2.7.13以上版本用波浪线(~)代替了负号(-)


上面的都是单条件表达,如果我们想要多个条件呢?

例如如果我们想要 输出 A、C同学的三科成绩?

通过 name_arr 确定 A、C 行

# 输出 A、C同学的三科成绩
data_arr2d[(name_arr == 'A') | (name_arr == 'C')]# 输出
[[ 1.13042124 -1.6739234   0.53706167][-0.01815399 -1.11894791  0.54558887]]

如果我们只想要输出在 0-1之间的所有数据呢?

通过 data_arr2d 值筛选确定值在 0-1 之间的数据

# 输出在 0-1之间的所有数据
data_arr2d[(data_arr2d > 0) & (data_arr2d < 1)]# 输出
[0.53706167 0.00312314 0.54558887 0.07955776]

可以看到,在组合应用多个布尔条件,使用 &(与)、|(或)、!(非)算术运算符

特别注意的是:Python 关键字 and 和 or 在布尔型数组中无效

最后一个问题,如果我们想要把所有负数用0代替呢?

通过筛选选出所有小于0的值,通过修改视图修改源数组的值

# 负数全部用0代替
data_arr2d[data_arr2d < 0] = 0# 输出
[[1.13042124 0.         0.53706167][0.         0.         0.00312314][0.         0.         0.54558887][0.         0.07955776 0.        ][0.         0.         1.1033876 ]]

最后这个问题就有点数据清洗的思想了,小于0 的数据属于异常值,对于异常值我们可以通过剔除该数据、用其他值填充等方式处理

总结一下:

如果你没有看懂今天的逻辑,最后的总结非常有必要,细品一下

首先,通过列表的相关特性,我们从一维、二维分别分析数组的相关特性。

列表切片:通过起始下标、结束下标、步长等参数进行切片操作。

一维数组:在列表切片的基础上,多了布尔型索引、修改视图结果的功能

二维数组:在一位切片的功能上,新增第二维切片,且同时支持索引+切片的功能。

最后,别忘了刚开始提出的问题,List 和 NumPy 有哪些异同?

同学们自己回答,看完文章回答这个问题应该很简单。

写在后面的话

NumPy 第二节内容,如果你理解了列表的切片,其实这个就很好理解了。

所以还是那句话,最基础的东西,都是在给以后的高阶内容打基础。

NumPy 也是,理解了 NumPy,在以后的数据清洗、算法推导有很大帮助!

碎碎念一下

最全的干货已经开始了,大家不要掉队。

数据分析的重点已经开始了,加油鸭!

878d120a3564265834567be6d5af3375.gif

Python 系列

入门:准备工作  运算符  数据类型①  数据类型②  流程控制  函数  文件  模块  异常

进阶:面向对象  正则表达式  多线程与多进程  JSON操作  时间序列  数据库操作  邮件发送

高阶:事半功倍的高阶函数  NumPy系列①

技巧:学习技巧①  学习技巧②  学习技巧③

爬虫系列

基础:准备工作  爬虫实现方式  Requests详解  BeautifulSoup详解

进阶:获取动态数据①  获取动态数据②

实战:爬取豆瓣电影  豆瓣电影分析  爬取链家租房

其他系列

学排版:Markdown排版教程

领资料:100G+数据分析资料免费领

非技术系列

讲故事:小一的故事  和二三四们的故事

听故事:投稿故事①

投故事:看故事之前先看我

好巧啊,你也读到这了!    

点个在看让我看到你5c87525d2dc20d32b85e049c26bd1bf9.gif

这篇关于浅入浅出数据分析之Hello NumPy系列(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/298251

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特