查看原文
其他

【数据分析-入门】一看就会!Numpy的创建、索引、切片与更新

爬虫俱乐部 Stata and Python数据分析 2023-01-01

本文作者:温和铭,中南财经政法大学统计与数学学院

本文编辑:刘光中

技术总编:王玉婷

Stata&Python云端课程来啦!

      好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程Stata进阶课程Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

引言
        在之前的推文【数据分析-入门】科学计算基本库—Numpy的简单使用中,我们已经知道了Numpy是Python中的基础包,相比Python内建的数组类型,支持更高维度的数组和矩阵运算,可以使得科学计算更加高效。今天这篇推文就带着大家进一步了解Numpy的基础知识,学习数组的基本操作,快速入门Numpy!
一、Numpy的参数

        Numpy的对象是N维数组ndarray,它是一系列同类型数据的集合,不同于Python中的内建对象(列表、元组、字典),ndarray能够处理高维数组,这也是Numpy最重要的一个特性。在Numpy中,维度被称为轴,下面的例子可以帮助我们更好地理解“轴”及相关概念:

[[2,8,0],[0,1,3]]   

上面展示的是一个矩阵,是一个二维数组,即有两个轴。第一轴的长度为2(行数为2),第二轴的长度为3(列数为3)。在Numpy中,ndarray有以下属性值:

ndarray.ndim:在Python中被称为秩,是轴(维度)的个数。
ndarry.shape:数组的维度,对于n×m矩阵,输出为n行m列。
ndarry.size:数组元素的总数,等于shape元素的乘积。
ndarry.dtype:描述数组中元素的数据类型。
ndarry.itemsize:数组中每个元素所占的字节数。
ndarry.data:是一个缓冲区,包含实际的数组元素,但一般可直接通过索引获取元素,故此属性值不常用。
接下来我们通过一个具体的例子看一下这些属性对应的值。
import numpy as nps=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 # 2s.shape # (3,4)s.size # 12s.dtype # dtype('int32'),不同电脑系统的数据类型可能不相同s.itemsize # 4

二、如何创建数组?

1.array函数创建

常用Numpy库中的array函数创建数组,命令结构为:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

其中各个参数的含义如下,其中,除object外都为可选项。

object:数组或嵌套的数列
dtype:数组元素的数据类型
copy:对象是否需要复制
order:创建数组的样式,C为行方向,F为列方向,A为任意方向
subok:默认返回一个与基类类型一致的数组
ndmin:指定生成数组的最小维度
通常从Pyhon常规的列表或者元组中获得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]
注意:在传递参数object的时候要记得写成列表或元组的形式,直接传入多个数字元素是不行的,例如a = np.array(1,2,3,4)就会产生如下报错(只接受2个非关键字参数)

2.arange函数创建

除了array(),我们也可以通过arange()创建数组,命令结构为:

numpy.arange(start,stop,step,dtype=None)

其中,startstop分别表示值所在的范围,是左闭右开区间,step表示间隔,参数dtype可以设定数组内元素的数据类型。举个例子:

import numpy as npnp.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 npa = 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] #索引第二行第二列的元素,输出结果为7a[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])

(2)冒号切片

我们也可以使用冒号来分隔切片参数start:stop:step。使用方法和slice()函数类似。

b = a[0:3:2] #在第一行到第四行中,每两行取一次数组元素c = a[2:] #截取第三行开始的所有元素print(b)print(c)

(3)省略号切片

在切片中,我们还可以添加省略号 …,使索引元组的长度与数组的轴数(维度)对齐。

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也变化


2.合并数组常见的合并有沿着行合并和沿着列合并两类,在Numpy中表示为以下两个函数。

(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)


3.拆分数组

与合并相对应,数组的拆分也是按行、按列两个方向。

(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 #输出结果为Falsed.base is a #输出结果为False,说明d和a是两个不同的对象

以上就是快速入门Numpy所要学习的基础知识,本文对与数组相关的函数的基本功能进行了介绍,快动手练习一下吧!

(END)重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:


最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!





往期推文推荐带你玩转Stata编码
一言不合就teamviewer

【基础篇】循环语句的continue与break

      教你用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)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可

以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存