前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >炒鸡简单,带你快速撸一遍Numpy代码!

炒鸡简单,带你快速撸一遍Numpy代码!

作者头像
小小詹同学
发布于 2019-11-09 15:34:22
发布于 2019-11-09 15:34:22
1.5K00
代码可运行
举报
文章被收录于专栏:小詹同学小詹同学
运行总次数:0
代码可运行

作者:贾胜杰,硕士,退役军人,电气工程专业,现成功转行K12领域数据挖掘工程师,不仅在数据清理、分析和预测方向,而且在自制力和高效学习方面都有丰富经验。 编辑:王老湿

我们一起来学习Python数据分析的工具学习阶段,包括NumpyPandas以及Matplotlib,它们是python进行科学计算,数据处理以及可视化的重要库,在以后的数据分析路上会经常用到,所以一定要掌握,并且还要熟练!今天先从Numpy开始

本文目标

  • 初识Numpy
  • ndarray的增删改查
  • ndarray切片与筛选
  • ndarray运算与排序

NumPy 简介

NumPyNumerical Python 的简称,它是 Python 中的科学计算基本软件包。NumPy 为 Python 提供了大量数学库,使我们能够高效地进行数字计算。更多可点击Numpy官网(http://www.numpy.org/)查看。

关于Numpy需要知道的几点:

  • NumPy 数组在创建时有固定的大小,不同于Python列表(可以动态增长)。更改ndarray的大小将创建一个新的数组并删除原始数据
  • NumPy 数组中的元素都需要具有相同的数据类型,因此在存储器中将具有相同的大小。数组的元素如果也是数组(可以是 Python 的原生 array,也可以是 ndarray)的情况下,则构成了多维数组。
  • NumPy 数组便于对大量数据进行高级数学和其他类型的操作。通常,这样的操作比使用Python的内置序列可能更有效和更少的代码执行

所以,Numpy 的核心是ndarray对象,这个对象封装了同质数据类型的n维数组。起名 ndarray 的原因就是因为是 n-dimension-array 的简写。接下来本节所有的课程都是围绕着ndarray来讲的,理论知识较少,代码量较多,所以大家在学习的时候,多自己动动手,尝试自己去运行一下代码。

创建ndarray

  • 由python list创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1维数组
a = np.array([1, 2, 3])  
print(type(a), a.shape, a[0], a[1], a[2])

out:
<class 'numpy.ndarray'> (3,) 1 2 3

# 重新赋值
a[0] = 5                 
print(a)

out:
[5 2 3]

# 2维数组
b = np.array([[1,2,3],[4,5,6]])   
print(b)

out:
[[1 2 3]
 [4 5 6]]

print(b[0, 0], b[0, 1], b[1, 0])

out:
1 2 4
  • 由numpy内置函数创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建2x2的全0数组
a = np.zeros((2,2))  
print(a)

out:
[[ 0.  0.]
 [ 0.  0.]]

 # 创建1x2的全1数组
b = np.ones((1,2))  
print(b)

out:
[[ 1.  1.]]

# 创建2x2定值为7的数组
c = np.full((2,2), 7) 
print(c)

out:
[[7 7]
 [7 7]]

# 创建2x2的单位矩阵(对角元素为1)
d = np.eye(2)        
print(d)

out:
[[ 1.  0.]
 [ 0.  1.]]

#创建一个对角线为10,20,30,50的对角矩阵
d_1 = np.diag([10,20,30,50]) 
print(d_1)

out:
[[10 0 0 0]
 [ 0 20 0 0]
 [ 0 0 30 0]
 [ 0 0 0 50]]

#创建一个一维的0-14的数组
e = np.arange(15)   
print(e)

out:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

#创建一个一维的4-9的数组
e_1 = np.arange(4,10)  
print(e_1)

out:
[4 5 6 7 8 9]

#创建一个一维的1-13且以间隔为3的数组
e_2 = np.arange(1,14,3)  
print(e_2)

out:
[ 1 4 7 10 13]

#创建一个一维的范围在0-10,长度为6的数组
f = np.linspace(0,10,6)  
print(f)

out:
#各个元素的间隔相等,为(10-0)/(6-1) = 2,若不想包含末尾的10,可以添加参数endpoint = False
[ 0.,  2.,  4.,  6.,  8., 10.]  

#把arange创建的一维数组转换为34列的二维数组
g = np.arange(12).reshape(3,4)  
print(g)                        

out:
#注意:使用reshape转换前后的数据量应该相同,12 = 3x4
[[ 0,  1,  2,  3],              
 [ 4,  5,  6,  7],
 [ 8,  9, 10, 11]]              

# 2x2的随机数组(矩阵),取值范围在[0.0,1.0)(包含0,不包含1)
h = np.random.random((2,2)) 
print(e)

out:
[[ 0.72776966  0.94164821]
 [ 0.04652655  0.2316599 ]]

#创建一个取值范围在[4,15)22列的随机整数矩阵
i = np.random.randint(4,15,size = (2,2))  
print(i)

out:
[[6, 5],
 [5, 9]]

#创建一个从均值为0,标准差为0.1的正态分布中随机抽样的3x3矩阵
j = np.random.normal(0,0.1,size = (3,3))  
print(j)

out:
[[-0.20783767, -0.12406401, -0.11775284],
 [ 0.02037018,  0.02898423, -0.02548213],
 [-0.0149878 ,  0.05277648,  0.08332239]]

访问、删除、增加ndarray中的元素

这里主要是提供了一些访问、更改或增加ndarray中某一元素的基础方法。

访问&更改

类似于访问python list中元素的方式,按照元素的index进行访问或更改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#访问某一元素,这里可以自己多尝试
#访问一维数组的某一元素,中括号内填写index
print(np.arange(6)[3]) 
out:3

#访问二维数组的某一元素,中括号内填写[,]
print(np.arange(6).reshape(3,2)[1,1]) 
out:3

#访问三位数组中的某一元素,中括号内[组,行,列]
print(np.arange(12).reshape(2,3,2)[0,1,1]) 
out:3

#更改某一元素,用 = 进行赋值和替换即可
a = np.arange(6)
a[3] = 7      #先访问,再重新赋值
print(a)
[0 1 2 7 4 5]
删除

可使用np.delete(ndarray, elements, axis)函数进行删除操作。

这里需要注意的是axis这个参数,在2维数据中,axis = 0表示选择axis = 1表示选择,但不能机械的认为0就表示行,1就表示列,注意前提2维数据中

在三维数据中,axis = 0表示组,1表示行,2表示列。这是为什么呢?提示一下,三位数组的shape中组、行和列是怎样排序的?

所以,axis的赋值一定要考虑数组的shape。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = np.arange(12).reshape(2,2,3)
#思考下,这里删除axis = 0下的第0个,会是什么结果呢?自己试一下
print(np.delete(a,[0],axis = 0))  

再有一点需要注意的是,如果你想让原数据保留删除后的结果,需要重新赋值一下才可以。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = np.arange(6).reshape(2,3)
np.delete(a,[0],axis = 0)
print(a)

array([[0, 1, 2],
       [3, 4, 5]])  #原数据并未更改

a = np.delete(a,[0],axis = 0)  #重新赋值
print(a)

array([[3, 4, 5]])   #原数据已更改
增加

往ndarray中增加元素的办法跟python list也很类似,常用的有两种:

  • 一种是添加(append),就是将新增的元素添加到ndarray的尾部
  • 语法为:np.append(ndarray, elements, axis)
  • 参数和delete函数一致,用法也一致,这里不再赘述
  • 一种是插入(insert),可以让新增元素插入到指定位置
  • 语法为:np.insert(ndarray, index, elements, axis)
  • 参数中就多了一个index,指示的是插入新元素的位置。

这里值得注意的是,不论是append还是insert,在往多维数组中插入元素时,一定要注意对应axis上的shape要一致。再一个就是,和delete一样,如果你想要更改原数据,需要重新赋值。

切片和筛选

ndarray切片

前面学了选择ndarray中的某个元素的方法,这里我们学习获取ndarray子集的方法——切片。

对于切片大家并不陌生,在list里面我们也接触过切片,一维的ndarray切片与list无异。需要注意的是,就是理解2维及多维ndarray切片。

  • 2维矩阵切片
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = np.arange(4*4).reshape(4,4)
print(a)

out:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

a[:,:-1]

out:
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10],
       [12, 13, 14]])

这里可以看出,我们筛选了a矩阵中前三列的所有行,这是如何实现的呢?

切片的第一个元素:表示的是选择所有行,第二个元素:-1表示的是从第0列至最后一列(不包含),所以结果如上所示。

再看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[1:3,:]

out:
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

筛选的是第2-3行的所有列。

  • 一个常用的切片

以列的形式获取最后一列数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[:,3:]

out:
array([[ 3],
       [ 7],
       [11],
       [15]])

以一维数组的形式获取最后一列数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a[:,-1]

out:
array([ 3,  7, 11, 15])

上面两种方法经常会用到,前者的shape为(4,1),后者为(4,)。

ndarray筛选

  • 选择ndarray的对角线

所用函数为np.diag(ndarray, k=N),其中参数k的取值决定了按照哪一条对角线选择数据。

默认k = 0,取主对角线;

k = 1时,取主对角线上面1行的元素;

k = -1时,取主对角线下面1行的元素。

思考:这个函数只能选择主对角线上的元素,那如果想要获取副对角线上的元素呢?

尝试自己搜索一下关键词numpy opposite diagonal寻找答案。

不建议你直接点getting the opposite diagonal of a numpy array。

  • 提取ndarray中的唯一值

所用函数为np.unique(ndarray),注意unique也可以添加参数axis来控制评判唯一值的轴方向,不好理解可以看示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#查看二维数组a中的唯一值
a = [[0,1,2],
     [3,4,5],
     [0,1,2]]
print(np.unique(a))    
array([0, 1, 2, 3, 4, 5])

#查看a中的唯一行(也就是没有重复的行)
print(np.unique(a,axis = 0))  
array([[0, 1, 2],
       [3, 4, 5]])

#查看a中的唯一列
print(np.unique(a,axis = 1))  
array([[0, 1, 2],
       [3, 4, 5],
       [0, 1, 2]])

#查看a中第一行的唯一值
print(np.unique(a[0]))  
array([0, 1, 2])
  • 通过布尔运算筛选

这里在中括号中添加筛选条件,当该条件的结果为True时(即满足条件时),返回该值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X[X > 10] #筛选数组X中大于10的数据

这里需要注意的是,当输入多个筛选条件时,&表示与,|表示或,~表示非。

运算与排序

ndarray运算

  • 集合运算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.intersect1d(x,y) #取x与y的交集
np.setdiff1d(x,y)   #取x与y的差集,返回的是在x中且没在y中的元素
np.union1d(x,y)     #取x与y的并集
  • 算术运算

我们可以通过+-*/np.addnp.substractnp.multiplynp.divide来对两个矩阵进行元素级的加减乘除运算,因为是元素级的运算,所以两个矩阵的shape必须要一致或者是可广播(Broadcast)。

这里所谓的可广播,就是指虽然A和B两个矩阵的shape不一致,但是A可以拆分为整数个与B具有相同shape的矩阵,这样在进行元素级别的运算时,就会先将A进行拆分,然后与B进行运算,结果再组合一起就可以。这里的A就是“可广播”矩阵。

上面涉及到的乘法是元素对应相乘,也就是点乘,那矩阵的叉乘呢?可以了解下numpy.matmul函数。

ndarray排序

我们使用np.sort()ndarray.sort()来对ndarray进行排序。

相同的是:

二者都可以使用参数axis来决定依照哪个轴进行排序,axis = 0时按照列排序,axis = 1时按照行排序;

不同的是:

np.sort()不会更改原数组;ndarray.sort()会更改原数组。

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小詹学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
0883-7.1.6-Queue Manager控制单个用户的超配资源
1.文档编写目的 在CDP集群中Yarn的资源池调度策略由CDH版本的FairScheduler转变为CapacityScheduler。在集群的使用过程中,如何更好的给各个租户分配集群资源?如何确保集群的资源可以更合理的使用? 在集群资源空闲时,如果租户还按照分配的资源大小运行作业,则会导致集群的资源闲置浪费,本篇文章主要通过介绍通过调整资源池的User Limit Factor参数来使租户可以超用分配的资源。 文档概述 1.测试环境说明 2.测试方案 3.User Limit Factory场景测试 4
Fayson
2022/07/27
7090
0883-7.1.6-Queue Manager控制单个用户的超配资源
hadoop之yarn(优化篇)
最近一直在学习hadoop的一些原理和优化,然后也做了一些实践,也有没有去做实践的,反正个人观点都记录下来
huofo
2022/03/01
1.8K0
{Submarine} 在 Apache Hadoop 中运行深度学习框架
作者:Wangda Tan、Sunil Govindan、Zhankun Tang
大数据文摘
2019/01/23
1.8K0
{Submarine}  在 Apache Hadoop 中运行深度学习框架
大数据平台:计算资源优化技术&作业诊断
大数据平台的资源管理组件主要针对存储资源与计算资源进行分析优化。前文《大数据平台:资源管理及存储优化技术》主要介绍了存储资源优化,本文主要介绍大数据平台构建过程中,计算资源相关的优化技术。
Yiwenwu
2024/05/03
7380
大数据平台:计算资源优化技术&作业诊断
Spark on Yarn资源配置
工作期间,我提交spark任务到yarn上,发现指定的资源(使用内存大小。使用core的个数)总是与yarn的UI页面显示的资源使用量不一致,写本文说明一下这个问题,以及介绍一下spark on yarn的资源配置。
CoderJed
2019/05/15
2.4K0
Yarn资源调度器
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
ha_lydms
2023/09/07
3790
Yarn资源调度器
Hive 调优,先掌握这几种优化模式
Hive和MapReduce中拥有较多在特定情况下优化的特性,如何利用好相关特性,是Hive性能调优的关键。本文就介绍那些耳熟但不能详的几种Hive优化模式。
大数据技术架构
2020/03/25
5770
0499-如何使用潜水艇在Hadoop之上愉快的玩耍深度学习
Hadoop是时下最流行的企业级开源大数据平台技术,你可以将它部署在本地,也可以部署在云端。而深度学习,对于企业用户来说举几个简单的例子,常见的场景包括语音识别,图像分类,AI聊天机器人或者机器翻译。为了训练深度学习/机器学习模型,我们可以利用TensorFlow/MXNet/Pytorch/Caffe/XGBoost等框架。有时这些框架也会被一起使用用于解决不同的问题。
Fayson
2019/11/27
9250
Apache Spark 1.5新特性介绍
Apache Spark社区刚刚发布了1.5版本,大家一定想知道这个版本的主要变化,这篇文章告诉你答案。 DataFrame执行后端优化(Tungsten第一阶段) DataFrame可以说是整个Spark项目最核心的部分,在1.5这个开发周期内最大的变化就是Tungsten项目的第一阶段已经完成。主要的变化是由Spark自己来管理内存而不是使用JVM,这样可以避免JVM GC带来的性能损失。内存中的Java对象被存储成Spark自己的二进制格式,计算直接发生在二进制格式上,省去了序列化和反序列化时间。同时
CSDN技术头条
2018/02/09
8760
Apache Spark 1.5新特性介绍
YJango:TensorFlow高层API Custom Estimator建立CNN+RNN的演示
该文是YJango:TensorFlow中层API Datasets+TFRecord的数据导入的后续。
YJango
2018/04/03
2.6K3
YJango:TensorFlow高层API Custom Estimator建立CNN+RNN的演示
【Dr.Elephant中文文档-6】度量指标和启发式算法
我们将作业的资源使用量定义为任务容器大小和任务运行时间的乘积。因此,作业的资源使用量可以定义为mapper和reducer任务的资源使用量总和。
一条老狗
2019/12/26
1.3K0
Hadoop3.0扩展Yarn资源模型详解2:资源Profiles说明
问题导读 1.Resource profiles解决了什么问题? 2.使用profile的好处是什么? 3.配置文件的简洁模式如何配置? 上一篇hadoop3.0扩展Yarn资源模型详解1 h
用户1410343
2018/03/26
1.2K0
戳破 | hive on spark 调优点
微信交流群里有人问浪尖hive on spark如何调优,当时浪尖时间忙没时间回答,这里就给出一篇文章详细聊聊。强调一下资源设置调优,这个强经验性质的,这里给出的数值比例仅供参考。
Spark学习技巧
2018/08/20
1.9K0
《算法竞赛进阶指南》0x18 总结与练习
这一天,刚刚起床的达达画了一排括号序列,其中包含小括号 ( )、中括号 [ ] 和大括号 { },总长度为
一只野生彩色铅笔
2022/10/31
9690
《算法竞赛进阶指南》0x18 总结与练习
进击大数据系列(五):Hadoop 统一资源管理和调度平台 YARN
Apache Yarn(Yet Another Resource Negotiator的缩写)是hadoop集群资源管理器系统,Yarn从hadoop 2引入,最初是为了改善MapReduce的实现,但是它具有通用性,同样执行其他分布式计算模式。
民工哥
2023/08/22
1.3K0
进击大数据系列(五):Hadoop 统一资源管理和调度平台 YARN
搭建Hadoop3集群
强烈建议再搭建hadoop集群之前体验一下单机模式和伪分布式模式的搭建过程,可以参考以下链接:
职场亮哥
2020/10/10
1.2K0
[kubectl-resource-view]: 一款用于查看k8s资源使用情况的插件
一款自己编写的k8s 命令行插件,用于查看k8s node和pod资源的 cpu、 memory、 gpu的request 和limit 使用情况。
没有故事的陈师傅
2024/12/02
1350
[kubectl-resource-view]: 一款用于查看k8s资源使用情况的插件
北航提出 PTQ4SAM | 一种高效的分割任何模型训练后量化框架,实现了无损精度,速度提高了3.9 倍 !
具有卓越的零样本能力和用户友好的灵活提示技术,Segment Anything Model(SAM)最近已成为一系列通用视觉应用中的新型基础模型,包括图像分割、目标检测、跟踪和其他下游任务。然而,SAM中的 Transformer 架构需要密集的计算和内存占用,这阻碍了在资源受限的边缘设备上的实际部署。
AIGC 先锋科技
2024/07/08
5960
北航提出  PTQ4SAM  |  一种高效的分割任何模型训练后量化框架,实现了无损精度,速度提高了3.9 倍 !
【工具】Apache Spark 1.5发布了!!!
Apache Spark社区刚刚发布了1.5版本,大家一定想知道这个版本的主要变化,这篇文章告诉你答案。 DataFrame执行后端优化(Tungsten第一阶段) DataFrame可以说是整个Spark项目最核心的部分,在1.5这个开发周期内最大的变化就是Tungsten项目的第一阶段已经完成。主要的变化是由Spark自己来管理内存而不是使用JVM,这样可以避免JVM GC带来的性能损失。内存中的Java对象被存储成Spark自己的二进制格式,计算直接发生在二进制格式上,省去了序列化和反序列化时间。同
小莹莹
2018/04/20
6160
【工具】Apache Spark 1.5发布了!!!
Trio-ViT | 专门针对高效 ViTs 的卷积 Transformer混合架构的加速器!
感谢自注意力机制强大的全局信息提取能力,Transformers在各种自然语言处理(NLP)任务中取得了巨大成功。这一成功催生了视觉Transformers(ViTs)[4, 5]的快速发展,它们在计算机视觉领域受到了越来越多的关注,并且与基于卷积的对应物相比显示出优越的性能。
集智书童公众号
2024/05/17
4890
Trio-ViT | 专门针对高效 ViTs 的卷积 Transformer混合架构的加速器!
推荐阅读
相关推荐
0883-7.1.6-Queue Manager控制单个用户的超配资源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档