【数据分析】numpy基础第二天

文章目录

    • 前言
    • 数组的形状变换
      • reshape的基本介绍
      • 使用reshape
      • reshape([10, 1])运行结果
      • reshape自动判断形状
      • reshape([-1, 1])运行结果
    • 合并数组
      • 使用vstack和hstack
      • vstack和hstack的运行结果
      • 使用concatenate
      • concatenate运行结果
    • 分割数组
      • array_split运行结果
    • 数组的条件筛选
      • 条件筛选运行结果

前言

本文包含数组的形状变换数组的合并和分割数组的条件筛选,为了专注于应用,我只会讲解其中相对常用的几个部分。

建议先读完第一天(点击传送)的文章再读本文。

本文代码:
链接
提取码:1024`

数组的形状变换

在Numpy中,数组的形状变换是非常常见的操作,它让你能够重新排列数组的维度。本人认为最常用的形状变换方法是reshape,因此本部分我们只会讲解reshape

reshape的基本介绍

通常,我们会给reshape传入一个列表,或者元祖,这里为了区分圆括号,我们将会传入列表,列表中的元素指定了形状。在下面的代码中,我们将会写reshape([10, 1])reshape([-1, 1])

使用reshape

假设你有一个1维数组(只有一个维度的数组),你想要将它转换为一个多个行1个列的数组(拥有两个维度的数组)(通常,这是一个适合sklearn的机器学习模型的输入格式的2维数组),现在我们知道这个1维数组有10个元素,如果它们要变成只有1列的形式,意味着它们有10行,我们可以写reshape([10, 1]),代表将数组转为10行1列的二维数组,请看下面代码:

import numpy as np# 创建一个1维数组
arr = np.arange(10)  # 这将生成一个包含0到9的数组# 使用reshape将其变为2维数组
arr_reshaped = arr.reshape([10, 1])
print('原来的数组:')
print(arr)
print()
print('reshape([10, 1])之后的数组:')
print(arr_reshaped)

reshape([10, 1])运行结果

可以看到,我们的数组的形状已经成功改变了。
在这里插入图片描述

reshape自动判断形状

上文中,我们希望将一个一维数组,arr,转为一个拥有多个行一个列的二维数组,由于我们很清楚arr 中有10个元素,所以我们写了reshape(10, 1),但如果我们不知道有多少个元素,但是仍然希望将这个一维数组变成多个行一个列的二维数组呢?此时,我们可以写reshape(-1, 1)-1代表的是:让Numpy自动推导形状

具体使用请看下面代码:

import numpy as np# 创建一个1维数组
arr = np.arange(10)  # 这将生成一个包含0到9的数组# 使用reshape将其变为2维数组
arr_reshaped = arr.reshape([-1, 1])
print('原来的数组:')
print(arr)
print()
print('reshape([-1, 1])之后的数组:')
print(arr_reshaped)

reshape([-1, 1])运行结果

可以看到,即使我们没有指定行数为10,Numpy也自动推导出了新形状应有的行的个数。

在这里插入图片描述

合并数组

合并是将多个数组拼接为一个更大的数组。在Numpy中,你可以用concatenate、vstack和hstack等方法来实现。

使用vstack和hstack

比较简单易理解的是下面两种方法:

  • vstack(垂直堆叠)
  • hstack(水平堆叠)

我们一般会把要进行堆叠的Numpy数组放入一个列表中,再传给vstackhstack,比如vstack([arr1, arr2]),我们把arr1arr2装入一个列表中,传给vstack进行垂直堆叠,hstack的使用方法同理。

具体请看下面的代码:

import numpy as np# 创建两个数组
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])# 垂直堆叠
arr_vstack = np.vstack([arr1, arr2])# 水平堆叠
arr_hstack = np.hstack([arr1, arr2])
print('arr1: ')
print(arr1)
print()
print('arr2:')
print(arr2)
print()
print('arr1和arr2进行vstack(垂直堆叠)之后:')
print(arr_vstack)
print()
print('arr1和arr2进行hstack(水平堆叠)之后:')
print(arr_hstack)

vstack和hstack的运行结果

在这里插入图片描述

使用concatenate

concatenate相对更加灵活,但是对于初学者来说也相对复杂。

concatenate相对vstackhstack,多了一个参数叫axis,你可以通过指定axis的值指定堆叠的轴

  • axis=0时,在的轴上进行堆叠,与vstack的效果相同
  • axis=1时,在的轴上进行堆叠,与hstack的效果相同

axis更大的时候,就是在高维数组上的操作了,对于初学者来说可能会太过抽象,可以暂时忽略,先理解简单情况,学习会更高效。

print('arr1: ')
print(arr1)
print()
print('arr2:')
print(arr2)
print()# 使用concatenate进行垂直堆叠
arr_vstack = np.concatenate([arr1, arr2], axis=0)print('arr1和arr2进行concatenate([arr1, arr2], axis=0)之后:')
print(arr_vstack)# 使用concatenate进行水平堆叠
arr_hstack = np.concatenate([arr1, arr2], axis=1)print('arr1和arr2进行concatenate([arr1, arr2], axis=1)之后:')
print(arr_hstack)

concatenate运行结果

可以看到,我们只需要使用一个concatenate就可以完成vstackhstack两者的任务。
在这里插入图片描述

分割数组

数组的分割操作相对较少用,我们了解一下即可。

我们可以使用array_split,将一个数组分为指定数量的部分。

具体请看下面代码:

import numpy as nparr = np.arange(10)  # 创建一个包含0到9的数组
newarr = np.array_split(arr, 5)  # 分割成5部分print(newarr)

array_split运行结果

可以看到我们的数组被分割成了5个相同大小的部分。
在这里插入图片描述

数组的条件筛选

在Numpy中,你可以使用条件筛选来获取数组中符合特定条件的元素,这里的筛选操作和pandas相差不大,弄懂了numpy的条件筛选,你可以很自然地用到pandas上。

对于单个条件:

  • 筛选出数组中大于5的元素,可以写arr[arr > 5]
  • 筛选出数组中等于5的元素,可以写arr[arr == 5]
  • 筛选出数组中小于5的元素,可以写arr[arr < 5]

对于多个条件:

  • 筛选出数组中小于5,同时大于2的元素,可以写arr[(arr < 5) & (arr > 2)]

注意: 不同条件必须使用圆括号括起来。如果对这个注意点有疑问,请看解释,如果看解释看得一头雾水,请跳过。

解释:
&代表and,也就是二进制运算中的按位与运算,因为按位与的特性,也有人会将&当成Python的关键字and使用来结合多个条件,这里刚刚提到的(arr < 5) & (arr > 2)就是这个用法。

如果写arr & 5,代表对arr中的所有元素跟5进行一次按位与运算,运算结果是数值,比如,arr中的数字3的二进制表达是011,因为arr & 5,所以arr中的数字3会与数字5的二进制表达(101)进行按位与运算,运算结果是001,也就是十进制中的1。

因此&的结果不仅仅是结合多个条件中得到的true或者false,在一些需要用到位运算的情况下,我们可能希望比较按位与之后的数值结果,而不是简单地使用&来结合多个条件。既然有按位与结合条件这两种用法,如果不同条件不加括号,难免造成歧义,为了消除歧义,Numpy的开发者要求我们不同条件必须使用圆括号括起来



以此类推,你可以自己尝试编写其它类似的代码。 具体请看下面的代码。
import numpy as np# 创建一个数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])# 条件筛选
greater = arr[arr > 5]
equals = arr[arr == 5]
less = arr[arr < 5]
between = arr[(arr < 5) & (arr > 2)]print('大于5:', greater)
print('等于5:', equals)
print('小于5:', less)
print('小于5同时大于2:', between)

条件筛选运行结果

在这里插入图片描述

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

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

相关文章

Spring结合工厂模式

学习设计模式&#xff0c;不要进入一个误区生搬硬套&#xff0c;它是一种编程思想&#xff0c;结合实际使用&#xff0c;往往设计模式是混合使用的 工厂模式 核心本质&#xff1a;使用工厂统一管理对象的创建&#xff0c;将调用者跟实现类解耦 我这里使用Spring容器的支持&am…

Threejs 展示——fbx 格式模型导入

文章目录 需求分析 需求 导入fbx 格式的模型数据 分析 需要准备 fbx 格式的数据&#xff0c;如下所示 <template><div id"three-canvas" /> </template> <script> // import { Color, MOUSE, PerspectiveCamera, Scene, WebGLRenderer } …

Python算法题集_找到字符串中所有字母异位词

本文为Python算法题集之一的代码示例 题目438&#xff1a;找到字符串中所有字母异位词 说明&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字…

Unity 外观模式(实例详解)

文章目录 示例1&#xff1a;初始化游戏场景中的多个子系统示例2&#xff1a;管理音频播放示例3&#xff1a;场景加载流程示例4&#xff1a;UI管理器示例5&#xff1a;网络服务通信 在Unity中使用外观模式&#xff08;Facade&#xff09;时&#xff0c;主要目的是为了简化复杂子…

MySQL数据查询语言DQL

MySQL数据查询语言DQL 目录 MySQL数据查询语言DQLDQL关键字数据查询语言DQL1.查询表2.子查询3.联表查询4.GROUP BY5.HAVING6.分页查询7.排序查询 DQL关键字 DQL关键字含义SELECTSELECT 字段列表&#xff0c;查询检索的列或表达式&#xff0c;它指定了最终结果包含的列FROMFROM…

vue —— h函数的学习与使用

文章目录 一、h函数是什么&#xff1f;二、h函数格式说明及使用示例1&#xff1a;简单创建一个VNode&#xff08;vue3&#xff09;示例2&#xff1a;vue2中h函数用法示例3&#xff1a;vue3中h函数的用法vue2和vue3中h函数的区别&#xff1f; 三、h函数实现原理四、h函数常用场景…

《动手学深度学习(PyTorch版)》笔记3.1

Chapter3 Linear Neural Networks 3.1 Linear Regression 3.1.1 Basic Concepts 我们通常使用 n n n来表示数据集中的样本数。对索引为 i i i的样本&#xff0c;其输入表示为 x ( i ) [ x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) ] ⊤ \mathbf{x}^{(i)} [x_1^{(i)}, x_2…

opencv学习笔记

学习OpenCV3 文章目录 学习OpenCV3openCV模块介绍 图片处理滤波/卷积核高斯滤波 算子索贝尔(sobel)算子沙尔(Scharr)算子拉普拉斯算子Canny边缘检测 **实际使用** 形态学获取形态学卷积核全局二值化自适应阈值二值化腐蚀操作膨胀操作开运算、闭运算形态学梯度顶帽操作黑帽操作 …

Redis 学习笔记 2:Java 客户端

Redis 学习笔记 2&#xff1a;Java 客户端 常见的 Redis Java 客户端有三种&#xff1a; Jedis&#xff0c;优点是API 风格与 Redis 命令命名保持一致&#xff0c;容易上手&#xff0c;缺点是连接实例是线程不安全的&#xff0c;多线程场景需要用线程池来管理连接。Redisson&…

Flink的SQL开发

概叙 Flink有关FlinkSQL的官网: https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/table/sql/overview/ 阿里云有关FlinkSQL的官网: https://help.aliyun.com/zh/flink/developer-reference/overview-5?spma2c4g.11186623.0.0.3f55bbc6H3LVyo Ta…

谷歌seo内容营销怎么做?

谷歌SEO内容营销就像是在为两个观众准备一场表演&#xff0c;一边是用户&#xff0c;一边则是谷歌搜索引擎&#xff0c;那么所谓的内容营销&#xff0c;你自然需要知道你的观众想看什么&#xff0c;这就是关键词研究&#xff0c;帮你了解用户在搜索什么&#xff0c;然后&#x…

表单常用正则表达式(手机,邮箱,身份证,数字,空格...)

#表单常用正式表达式 为了后面项目的拿来即用以便不时之需&#xff0c;特意整理一文&#xff0c;把常用的表单验证的正则表达式整理如下。 不能为空 pattern: /^[^\s]$/ 验证手机号 pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8…