【数据分析-入门】一看就会!Numpy的创建、索引、切片与更新
本文作者:温和铭,中南财经政法大学统计与数学学院
本文编辑:刘光中
技术总编:王玉婷
Stata&Python云端课程来啦!
好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程,Stata进阶课程和Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
在之前的推文【数据分析-入门】科学计算基本库—Numpy的简单使用中,我们已经知道了Numpy是Python中的基础包,相比Python内建的数组类型,支持更高维度的数组和矩阵运算,可以使得科学计算更加高效。今天这篇推文就带着大家进一步了解Numpy的基础知识,学习数组的基本操作,快速入门Numpy!
Numpy的对象是N维数组ndarray,它是一系列同类型数据的集合,不同于Python中的内建对象(列表、元组、字典),ndarray能够处理高维数组,这也是Numpy最重要的一个特性。在Numpy中,维度被称为轴,下面的例子可以帮助我们更好地理解“轴”及相关概念:
[[2,8,0],
[0,1,3]]
上面展示的是一个矩阵,是一个二维数组,即有两个轴。第一轴的长度为2(行数为2),第二轴的长度为3(列数为3)。在Numpy中,ndarray有以下属性值:
import numpy as np
s=np.arange(12).reshape(3,4) #生成元素从0~11的3行4列矩阵
s
#结果为
#array([[ 0, 1, 2, 3],
#[ 4, 5, 6, 7],
#[ 8, 9, 10, 11]])
s.ndim # 2
s.shape # (3,4)
s.size # 12
s.dtype # dtype('int32'),不同电脑系统的数据类型可能不相同
s.itemsize # 4
常用Numpy库中的array函数创建数组,命令结构为:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
其中各个参数的含义如下,其中,除object外都为可选项。
import numpy as np
#创建一维数组
a = np.array([1,2,3,4,5])
print (a)
#输出结果为[1 2 3 4 5]
#创建二维数组
b = np.array([[1,2], [3,4]])
print (b)
#[[1 2]
# [3 4]]
b.ndim #2
#指定元素类型创建数组
c = np.array([1,2,3], dtype = complex)
print (c)
#输出结果为[1.+0.j 2.+0.j 3.+0.j]
除了array(),我们也可以通过arange()创建数组,命令结构为:
numpy.arange(start,stop,step,dtype=None)
其中,start和stop分别表示值所在的范围,是左闭右开区间,step表示间隔,参数dtype可以设定数组内元素的数据类型。举个例子:
import numpy as np
np.arange(2,8,1.5,dtype='float64') #在区间[2,8)内创建步长为1.5的数组
#输出结果为array([2. , 3.5, 5. , 6.5])
3.快速创建特殊数组除了上述两种方法,我们还可以通过特定的函数快速创建特殊的数组,如空数组、全零数组、全一数组等。import numpy as np
#(1)numpy.empty():创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组(输出的数组内元素为随机生成,实质上是空数组)。
x = np.empty([2,4], dtype = int)
#(2)numpy.zeros():创建指定形状和类型(默认为浮点数)的数组,数组元素全为0。
y = np.zeros([3,5])
#(3)numpy.ones():创建指定形状和类型(默认为浮点数)的数组,数组元素全为1。
z = np.ones([2,2])
print (x)
print (y)
print (z)
与list的切片类似,ndarray数组的内容可以通过索引或切片来获取和更改。
1.数组的索引索引可以通过0~n的下标来实现。对于一维数组,其索引过程和list类似,不再赘述,而二维数组有所不同,我们来看接下来这个例子。
import numpy as np
a = np.arange(30).reshape(5,6)
#首先生成一个元素从0~29的5行6列矩阵(二维数组)
#array([[ 0, 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, 28, 29]])
a[1,1]
#索引第二行第二列的元素,输出结果为7
a[2]
#索引第三行的元素,输出结果为array([12, 13, 14, 15, 16, 17])
a[0:4,3] #索引前四行、第四列的元素,输出结果为array([ 3, 9, 15, 21])
#多维的数组每个轴可以有一个索引。这些索引以逗号分隔的元组给出。
2.数组的切片(1)slice()函数切片切片可以利用slice()函数,设定start、stop和step参数来从原数组中”切割“出一个新数组,此时的切割区间也是左闭右开。继续以本节创建的5×6二维数组a为例,进行切片。s = slice(0,3,2) #在第一行到第四行中,每两行取一次数组元素
print(a[s])
我们也可以使用冒号来分隔切片参数start:stop:step。使用方法和slice()函数类似。
b = a[0:3:2] #在第一行到第四行中,每两行取一次数组元素
c = a[2:] #截取第三行开始的所有元素
print(b)
print(c)
在切片中,我们还可以添加省略号 …,使索引元组的长度与数组的轴数(维度)对齐。
print(a[...,2]) #截取第三列元素
print(a[2,...]) #截取第三行元素
print(a[...,2:]) #截取第三列及之后列的元素
1.修改数组的形状通常使用以下几个函数修改数组的形状:(1)reshape:不改变原数组的情况下修改形状,语法如下
numpy.reshape(a, newshape, order='C')
#a:要修改的数组;newshape:新的形状;order:排列顺序,C表示按行,F表示按列,A表示按原顺序。
(2)ravel:不改变原数组,对数组进行展开。numpy.ravel(a, order='C')
#a表示原始数组,order参数同reshape,默认按行展开
(3)T:不改变原数组,转置数组,在数组后加上.T即可实现。(4)resize:对原数组本身进行修改,语法如下。
numpy.resize(a, newshape)
# a:要修改的数组;newshape:新的形状
接下来我们依然以上一节构造的元素为0~29的5×6数组a为例,展示这几个函数的作用。b = a.reshape(6,5) #修改为6×5数组
c = a.ravel() #按行展开
d = a.T #转置
print(b)
print(c)
print(d)
print(a) #原数组a没有变化
a.resize((3,10)) #修改为3×10数组
print(a) #数组a也变化
(1)hstack:横向合并数组。
(2)vstack:纵向合并数组。
x = np.array([[1,1],[2,2]])
y = np.array([[3,3],[4,4]])
print(x)
print(y)
z1 = np.hstack((x,y))
z2 = np.vstack((x,y))
print('横向合并:')
print(z1)
print('纵向合并:')
print(z2)
与合并相对应,数组的拆分也是按行、按列两个方向。
(1)hsplit:指定要返回的相同形状的数组数量,横向拆分数组。(2)vsplit:纵向拆分数组。a = np.arange(12).reshape(3,4)
print('原数组:')
print(a)
print('沿行方向拆成2个数组:')
print(np.hsplit(a,2))
print('沿列方向拆成3个数组:')
print(np.vsplit(a,3))
当进行数组的计算或者更改时,有时会将数据复制到新数组中,有时则不会。以下三种情形可以帮助我们更好地判断是否将元素复制进了新数组。
1.不发生复制a = np.arange(8)
b = a #没有创建新的对象
b is a #输出结果为True,说明a和b只是同一个数组的不同名字,没有发生复制
b.shape = (2,4) #改变b指向的数组的形状
a.shape #输出结果为(2,4),与b一致,说明仍然是同一个对象,完全没有复制
2.浅拷贝浅拷贝的含义为:复制某个对象的引用,而不复制对象本身,新旧对象使用的是同一块内存。a = np.arange(8)
c = a.view() #view()函数的功能是创建一个查看相同数据的新数组对象。
c is a #输出结果为False,说明c与a是不同的对象
c.base is a #输出结果为True,说明c与a共享同样的内存
c.shape = (2,4) #改变c指向的数组的形状
a.shape #输出结果为(8,),a的形状没有发生变化
3.深拷贝与浅拷贝不同,深拷贝则是生成一个与原对象一模一样的新对象,类似“双胞胎”,新旧对象占用不同的内存,对新对象进行修改不影响原对象。a = np.arange(8)
d = a.copy() #完全复制原数组的数据和形状
d is a #输出结果为False
d.base is a #输出结果为False,说明d和a是两个不同的对象
以上就是快速入门Numpy所要学习的基础知识,本文对与数组相关的函数的基本功能进行了介绍,快动手练习一下吧!
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐带你玩转Stata编码
一言不合就teamviewer 教你用Stata爬取全国疫情风险地区数据,原来这么简单!【数据结构】集合的使用方法 Stata爬取七普人口数据
浅析Python的序列化与反序列化
爬虫俱乐部的精彩答疑--爬虫为何失败?
利用Stata批量制作学生证 【数据分析-入门】科学计算基本库—Numpy的简单使用 Stata绘图系列——玩转绘图通用选项之图例 【基础篇】数据类型介绍——list、tuple和range对象覆盖北交所的“cnstock”复工了!
高考热度大数据爬虫——谁才是院校顶流
跨框架数据操作
河南大学经济学院2022年Stata数据处理与爬虫技术开班仪式顺利召开爬虫俱乐部的精彩答疑——local function
爬虫俱乐部精彩答疑——Python中的三种文件读取方法爬虫俱乐部的精彩答疑--认真仔细方能写出好程序爬虫俱乐部Python精彩答疑——更换Jupyter Notebook浏览器及dropna()参数详解
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可