热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高性能计算和数据分析的库——NumPy的简单使用方法

NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
高性能计算和数据分析的库——NumPy的简单使用方法
从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

一、一维数组

1.1数组与列表的不同之处

首先用平时熟悉的列表对比数组,进而初步认识什么是数组。使用numpy需要安装numpy库,安装方法:pip install numpy,安装好之后导入nump库,代码如下

import numpy as np

LIST = [1,3,5,7]
ARR = np.array(LIST)
print(type(ARR))

输出结果为:

可以看到输出结果是numpy类型了

接下来了解列表索引与数组索引,编写代码访问数组中的元素

import numpy as np

LIST = [1,3,5,7]
ARR = np.array(LIST)
print(LIST[0]) #打印数组的第一个元素,学过数组的都应该知道数组里面的元素是从第0个开始的
print(ARR[0])
print(ARR[2:]) #打印第2个和第2个后面的元素

输出结果:
1
1
[5,7]

从上述例子中可以发现列表与数组有着相同的元素和相同的索引机制,为什么还要引入Numpy包呢?其实列表与数组之间的首要区别是:数组是同类的,就是说数组的所有元素必须具有相同的类型。相反,列表可以包含任意类型的元素,例如可以将上面列表中的最后一个元素更改为一个字符串

LIST[-1] = 'string'
print(LIST)

输出结果为:[1,3,5,‘string’]

ARR[-1] = 'string'
print(ARR)

而上述代码则会报错,报错的原因是因为元素无效

ARR[-1] = 'string'
ValueError: invalid literal for int() with base 10: 'string'

也就是说一旦创建了一个数组,那么它的dtype也就固定了,它只能存储相同类型的元素。那么如何确定数组内的数据类型以保证正确的数据格式?其实有关数组类型的信息均包含在数组的dtype属性中。接下来访问数组中元素的数据类型,代码如下

print(ARR.dtype)

输出结果为:int32

上述结果显示ARR数组中的数据类型为整数类型。**如果为整数类型数组中添加字符串会怎么样呢?系统会因无法识别该数据类型而报错。**那么添加一个浮点类型的结果会怎样呢?事实证明,当存储一个浮点数据类型的时候,系统会自动将其转化为整数类型,代码如下

ARR[-1] = 1.2345
print(ARR)

输出结果为:
[1 3 5 1]

1.2数组的创建

在创建数组的时候,通常用一个常量值(一般为0或1)初始化一个数组,这个值通常是作为加法和乘法循环的起始值,创建实例代码如下:

import numpy as np

num = np.zeros(5,dtype=float) #这里创建浮点数类型全为零的数组
print(num) 
num1 = np.zeros(3,dtype=int) #这里创建整数类型全为零的数组
print(num1)
num2 = np.ones(5) #这里创建了值全为1的数组
print(num2)
num3 = np.ones(4)
num3.fill(5.5) #填充值为5.5
print(num3)

输出结果为:
[0. 0. 0. 0. 0.]
[0 0 0]
[1. 1. 1. 1. 1.]
[5.5 5.5 5.5 5.5]

最后,创建常用的随机数字的数组,在numpy中,np.random模块包含许多可用于创建随机数组的函数,例如生成一个服从标准正态分布(均值为0和方差为1,高中的知识忘得差不多了!)的5个随机样本数组,代码如下

random = np.random.randn(5) 
print(random)

输出结果为:
[-1.9083265 0.49668329 0.34133729 1.85447086 -0.85646652]

二、多维数组

上面使用的都是一维数组,其实Numpy可以创建N维数组对象(ndarray),也就是多个数组,这也是Numpy的一个关键特性,ndarray是一种快速并且节省空间的多维数组,它可以提供数组化算术运算和高级的广播功能。通过使用标准的数学函数,并不需要编写循环,便可以对整个数组的数据进行快速运算,除此之外ndarray还具备线性代数、随机数生成、和傅里叶变换的能力,总而言之ndarray是python中的一个具有计算快速、灵活邓特性的大型数据集容器,例如可以使用列表来初始化一个二维数组

import numpy as np

LIST2 = [[1,2],
         [3,4]]          #数组间用逗号隔开
ARR2 = np.array(LIST2)
print(ARR2)

输出结果为:
[[1 2]
[3 4]]

2.1多维数组的高效性能

(1)虽然可以使用[ ]运算符重复对嵌套列表进行索引,但多维数组支持更为自然的索引语法,只需一个[ ]和一组以逗号隔开的的索引即可,比如返回第一行第二列的数值,如下所示

import numpy as np

LIST2 = [[1,2],
         [3,4]]
ARR2 = np.array(LIST2)
print(LIST2[0][1])
print(ARR2[0,1])

输出结果为:
2
2
结果均为2

比如返回2行3列的array,且值全部为0,如下所示

a = np.zeros((2,3))
print(a)

输出结果为:
[[0. 0. 0.]
[0. 0. 0.]]

返回2行4列的array,且值均为10,标准差为3的正态分布的随机数,代码如下

b = np.random.normal(10,3,(2,4))
print(b)

输出结果为:
[[10.44959384 14.13345576 13.30487452 6.54541624]
[12.65727715 6.07423367 13.9951299 9.27647173]]

(2)实际上,只要元素的总数不变,数组的形状就可以随意的改变,例如想要一个数字从9增加到2x4的数组,最简单的方法如下

array1 = np.arange(9)
print(array1)
array2 = array1.reshape(3,3)#也就是分为3行3列的意思
print(array2)

输出结果为:
[0 1 2 3 4 5 6 7 8]
[[0 1 2]
[3 4 5]
[6 7 8]]
(3)多为数组的索引切片

LIST = [[1,2,3],
        [4,5,6]]
for i in LIST:
    print(i[2])

print(LIST[0])
print(LIST[1])

输出结果为:
3
6
[1, 2, 3]
[4, 5, 6]
到这里,您是否感觉到了多为数组的高效与魅力呢?

正在尝试写博客,把会的分享给你们,如有写的不好的地方,希望指点一下,谢谢!


推荐阅读
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
author-avatar
景雨韵文秀馨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有