python-数据分析-NumPy的应用-1、基础

news/2025/1/19 23:06:01/文章来源:https://www.cnblogs.com/littlecc/p/18239032

1、安装python 数据分析的三大神器

pip install numpy pandas matplotlib

 

NumpPy 的说明

Numpy 是一个开源的 Python 科学计算库,用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作、
对于同样的数值计算任务,使用 NumPy 不仅代码要简洁的多,而且 NumPy 在性能上也远远优于原生 Python、
至少是一到两个数量级的差距,而且数据量越大,NumPy 的优势就越明显。NumPy 最为核心的数据类型是ndarray,使用ndarray可以处理一维、二维和多维数组,该对象相当于是一个快速而灵活的大数据容器。
NumPy 底层代码使用 C 语言编写,解决了 GIL 的限制,ndarray在存取数据的时候,数据与数据的地址都是连续的,
这确保了可以进行高效率的批量操作,性能上远远优于 Python 中的list;另一方面ndarray对象提供了更多的方法来处理数据,
尤其获取数据统计特征的方法,这些方法也是 Python 原生的list没有的。

numpy模块的基础使用

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy
import pandas
import matplotlib#创建数组对象 - ndarray 创建ndarry有多种方法
# 1、是哦那个array函数、通过list创建数组对象
array1 = numpy.array([1, 2, 3, 4, 5])
print(array1)   #[1 2 3 4 5]
array2 = numpy.array([[1, 2, 3], [4, 5, 6]])    #输出会自动换行
print(array2)
#[[1 2 3]
# [4 5 6]]# 2、使用arange函数、指定取值范围和跨度创建数组对象
# arange(start, stop, step)
array3 = numpy.arange(0, 20, 2)
print(array3)   #[ 0  2  4  6  8 10 12 14 16 18]# 3、使用linspace函数、用指定范围和元素个数创建数组对象、生成等差数列
# linspace(start, stop, num)
array4 = numpy.linspace(-1, 1, 11)
print(array4)   #[-1.  -0.8 -0.6 -0.4 -0.2  0.   0.2  0.4  0.6  0.8  1. ]# 4、使用logspace函数、生成等比数列
# logspace(start, stop, num, base)
#start=1表示2的1次方
#stop=10表示2的10次方
#num=10表示生成10个数
#base=2表示以2为底
array5 = numpy.logspace(1, 10, num=10, base=2)  ##含义是生成 10 个数,这些数在对数基数为 2的刻度上从 2的1次方到2的10次方均匀的分布
print(array5)   #[   2.    4.    8.   16.   32.   64.  128.  256.  512. 1024.]#注意:等比数列的起始值是$2^1$,等比数列的终止值是$2^{10}$,num是元素的个数,base就是底数。# 5、通过fromstring函数从字符串提取数据创建数组对象
# fromstring(string, sep, dtype)
# string:字符串
# sep:分隔符
# dtype:数据类型 i8表示int64
array6 = numpy.fromstring('1 2 3 4 5', sep=' ', dtype='i8')
print(array6)   #[1 2 3 4 5]# 6、 通过fromiter函数从生成器(迭代器)中获取数据创建数组对象
def fib(how_many):a, b = 0, 1for _ in range(how_many):   # _ :表示忽略变量a, b = b, a + b         #生成斐波那契数列yield a
gen = fib(20)
array7 = numpy.fromiter(gen, dtype='i8')
print(array7)
'''
[   1    1    2    3    5    8   13   21   34   55   89  144  233  377610  987 1597 2584 4181 6765]
'''# 7、 使用numpy.random模块的函数生成随机数创建数组对象
#产生10个$[0, 1)范围的随机小数
array8 = numpy.random.rand(10)
print(array8)
"""
[0.97779416 0.65321969 0.92930144 0.77446802 0.8259189  0.406322530.04318595 0.75099474 0.28481314 0.46203626]
"""#产生10个$[1, 100)$范围的随机整数,代码:
array9 = numpy.random.randint(1, 100, 10)
print(array9)#产生20个$\small{\mu=50}$,$\small{\sigma=10}$的正态分布随机数,代码:
array10 = numpy.random.normal(50, 10, 20)
print(array10)#产生$[0, 1)$范围的随机小数构成的3行4列的二维数组,代码:
#numpy.random.rand(3, 4) -> 3行4列的二维数组
array11 = numpy.random.rand(3, 4)
print(array11)
'''
[[0.2151178  0.39222962 0.65308132 0.55345128][0.34604538 0.02472764 0.3164634  0.57257634][0.5175043  0.10675846 0.45963431 0.64124903]]
'''#产生$[1, 100)$范围的随机整数构成的三维数组,代码:
#numpy.random.randint(1, 100, (3, 4, 5)) -> 4行5列的三维数组
array12 = numpy.random.randint(1, 100, (3, 4, 5))
print(array12)
'''
[[[26  8 15 35  4][85 33 74 36 18][69 73 29 26 92][82  3 58  8 68]][[98 71 32 35 24][57 51 91 73 81][88 32 18 84 60][25 43 89 23 18]][[23 50 16 40 32][90 86 13 88 24][35 83 30 50 45][28 69 34  1 40]]]
'''# 8、 创建全0、全1或指定元素的数组
#zeros(shape, dtype=float)
#shape:数组形状,如(3, 4)表示3行4列
#dtype:数据类型,默认为float
array13 = numpy.zeros((3, 4))   #全0
print(array13)
'''
[[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]]
'''#ones(shape, dtype=float)
array14 = numpy.ones((3, 4))   #全1
print(array14)#使用full函数,代码:
#full(shape, fill_value, dtype=None)
#shape:数组形状,如(3, 4)表示3行4列
#fill_value:填充值
#dtype:数据类型,默认为float
array15 = numpy.full((3, 4), 10)
print(array15)
'''
[[10 10 10 10][10 10 10 10][10 10 10 10]]
'''
print("\n")
# 9、使用eye函数创建单位矩阵
#eye(N, M=None, k=0, dtype=float)
#N:矩阵的行数
#M:矩阵的列数,默认为N
#k:对角线偏移量,默认为0,表示对角线为1
#dtype:数据类型,默认为float
# array16 = numpy.eye(4, 4)
numpy.eye(4)
print(numpy.eye(4))
'''
[[1. 0. 0. 0.][0. 1. 0. 0.][0. 0. 1. 0.][0. 0. 0. 1.]]
'''
print("\n")
# 10、读取图片获得对应的三位数组
array17 = plt.imread('images/1.jpg')    #import matplotlib.pyplot as plt
print(array17)
#计算机系统中的图片通常由若干行若干列的像素点构成,而每个像素点又是由红绿蓝三原色构成的,刚好可以用三维数组来表示。读取图片用到了matplotlib库的imread函数

数组对象的属性

# -*- coding: utf-8 -*-
#数组对象的属性import numpy
import matplotlib
import pandas# 1、 size属性:获取数组元素个数
array1 = numpy.arange(1, 100, 2)    # 生成一个1-99之间,步长为2的数组
# print(array1)
print(array1.size)  #50
array2 = numpy.random.rand(3, 4)  # 生成一个3行4列的随机数组
print(array2.size)  #12# 2、shape获取数组的形状
print(array1.shape) #(50,) 50个元素
print(array2.shape) #(3, 4) 3行4列# 3、dtype属性、获取数组元素的数据类型
print(array1.dtype) #int32
print(array2.dtype) #float64# -*- coding: utf-8 -*-
#数组对象的属性import numpy
import matplotlib
import pandas# 1、 size属性:获取数组元素个数
array1 = numpy.arange(1, 100, 2)    # 生成一个1-99之间,步长为2的数组
# print(array1)
print(array1.size)  #50
array2 = numpy.random.rand(3, 4)  # 生成一个3行4列的随机数组
print(array2.size)  #12# 2、shape获取数组的形状
print(array1.shape) #(50,) 50个元素
print(array2.shape) #(3, 4) 3行4列# 3、dtype属性、获取数组元素的数据类型
print(array1.dtype) #int32
print(array2.dtype) #float64# 4、ndim属性:获取数组的维度
print(array1.ndim)  #1  表示数组是1维的
print(array2.ndim)  #2 表示数组是二维的# 5、itemsize属性:获取数组单个元素占用内存空间的字节数
print(array1.itemsize)  #4 表示数组中每个元素占用4个字节
print(array2.itemsize)  #8 表示数组中每个元素占用8个字节# nbytes属性:获取数据所有元素占用内存空间的字节数
print(array1.nbytes)    #200 表示数组中每个元素占用4个字节,总共50个元素
print(array2.nbytes)    #96 表示数组中每个元素占用8个字节,总共12个元素

ndarray对象元素的数据类型可以参考如下所示的表格

 

数组的索引运算

# -*- coding: utf-8 -*-
#数组的索引运算
'''
和 Python 中的列表类似,NumPy 的ndarray对象可以进行索引和切片操作,通过索引可以获取或修改数组中的元素,通过切片操作可以取出数组的一部分,我们把切片操作也称为切片索引。
'''import numpy# 1、普通索引
#类似于python中list类型的索引运算
array1 = numpy.arange(1, 10)
print(array1)   #[1 2 3 4 5 6 7 8 9]
print(array1[0], array1[array1.size - 1])   #1 9    #array1.size 获取数组长度
print(array1[-array1.size], array1[-1])     #1 9#numpy.array() 创建数组
array2 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(array2[2])    #[7 8 9]print(array2[0][0]) #1
print(array2[-1][-1])   #9print(array2[1][1]) #5
print(array2[1, 1]) #5  array2[1, 1] == array2[1][1]array2[1][1] = 10   #修改数组元素、赋值
print(array2)
'''
[[1 2 3][4 10 6][7 8 9]]
'''array2[1] = [10, 11, 12]    #修改数组元素、赋值
print(array2)
'''
[[1 2 3][10 11 12][7 8 9]]
'''
print("\n")#2、切片索引
#切片索引是形如[开始索引:结束索引:跨度]的语法,通过指定开始索引(默认值无穷小)、结束索引(默认值无穷大、等于最大的行数或列数)和跨度(默认值1)
#因为开始索引、结束索引和步长都有默认值,所以它们都可以省略,如果不指定步长,第二个冒号也可以省略
#一维数组的切片运算跟 Python 中的list类型的切片非常类似,此处不再赘述,二维数组的切片可以参考下面的代码
array3 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(array3)
#array3[选择行, 选择列]
print(array3[:2, 1:])  #:2 = 0:2:1 选择前两行(第0行和第1行)。   #1: = 1:3:1 选择从第二列(第1列)到末尾的所有列
'''
#这样看 
第 0 1  2 列[[1 2 3]    #第0行[4 5 6]    #第1行[7 8 9]]#输出
[[2 3][5 6]]
'''print(array3[2, :]) #2 第二行 、[:] = 0:3:1 选择所有列   #[7 8 9]print(array3[:, :2])    #[:, :2] = 0:3:1, 0:2:1 = 选择所有行、第0列到第1列(第0列和第1列)
'''
[[1 2][4 5][7 8]]
'''print(array3[::2, ::2]) #[::2, ::2] = 0:3:2, 0:3:2 = 选择所有行、所有列,跨度是2
'''
[[1 3][7 9]]
'''print(array3[::-2, ::-2])   #[::-2, ::-2] = 3:0:-2, 3:0:-2 = 选择所有行、所有列,跨度是-2
'''
[[9 7][3 1]]
'''

图1:二维数组的普通索引

二维数组的切片索引

花式索引

# -*- coding: utf-8 -*-
#花式索引
#花式索引是用保存整数的数组充当一个数组的索引,这里所说的数组可以是 NumPy 的ndarray,也可以是 Python 中list、tuple等可迭代类型,可以使用正向或负向索引。import numpy
array1 = numpy.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# print(array1)
print(array1[[0, 1, 1, -1, -2, 2]])  #[1 2 2 9 8 3]print("-------------------")array2 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) #3维数组
print(array2[[0, 2]])  #array2[[0, 2]] 表示获取array2的第0行和第2行print("-------------------")
print(array2)
print(array2[[0, 2], [1, 2]])   #array2[[0, 2], [1, 2]] 表示获取array2的第0行第一列、第二行的第二列
#可以这样看[0][1] [2][2]
'''
[[1 2 3][4 5 6][7 8 9]][2 9]   #拿到的值
'''
print("-------------------")
print(array2[[0, 2], 1])    #array2[[0, 2], 1] 表示获取array2的第0行的第1列和第2行的第1列
'''
[[1 2 3][4 5 6][7 8 9]][2 8]
'''

布尔索引

# -*- coding: utf-8 -*-
#布尔索引
#布尔索引就是通过保存布尔值的数组充当一个数组的索引,布尔值为True的元素保留,布尔值为False的元素不会被选中。布尔值的数组可以手动构造,也可以通过关系运算来产生。import numpyarray = numpy.array([1, 2, 3, 4, 5, 6])
array2 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(array[[True, False, True, False, True, False]])   #[1 3 5]
print('---------------------------')print(array > 5)    #[False False False False False  True]
print('---------------------------')
#~: 取反
print(~(array > 5)) #[ True  True  True  True  True False]
print('---------------------------')print(array % 2 == 0)   #[False  True False  True False  True]
print('---------------------------')print(array2[array2 % 2 == 0])  #[2 4 6 8]
print('---------------------------')print((array > 5) & (array % 2 == 0))   #[False False False False False  True]
#说明:&运算符可以作用于两个布尔数组,如果两个数组对应元素都是True,那么运算的结果就是True,否则就是False,
# #该运算符的运算规则类似于 Python 中的 and 运算符,只不过作用的对象是两个布尔数组
print('---------------------------')print(array[(array > 5) & (array % 2 == 0)])    #[6]
print('---------------------------')print(array[(array > 5) | (array % 2 == 0)])    #[2 4 6]
#说明:|运算符可以作用于两个布尔数组,如果两个数组对应元素都是False,那么运算的结果就是False,否则就是True,
# 该运算符的运算规则类似于 Python 中的 or 运算符,只不过作用的对象是两个布尔数组。
print('---------------------------')

 

案例:通过数组切片处理图像

可以用三维数组来表示图像,那么通过图像对应的三维数组进行操作,就可以实现对图像的处理,如下所示。

# -*- coding: utf-8 -*-
#案例、通过数组切片处理图像
import matplotlib.pyplot as plt
import numpy
import matplotlib#读入图片创建三位数组对象
guido_img = plt.imread('images/2.jpg')  # 读取图片
plt.imshow(guido_img)   # 显示图片print(plt.imshow(guido_img))    #AxesImage(size=(2307, 3461))#对数组的0轴进行反向切片,实现图像的垂直翻转。
print(plt.imshow(guido_img[::-1]))

 

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

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

相关文章

鸿蒙前端开发1-基本设置

1.AppScope>app.json5 中的icon和label设置,位置手机>设置>应用显示的图标和名称。标签值为字符串资源的索引,不能直接写名字,应该在字符串资源中设置 2.entry>configuration.json5中的icon和label设置的是应用安装后在桌面显示的图标和名称 3.

java第二次大作业blog

pta第二次博客 目录 • pta第二次博客 o 1.前言 o 2.设计与分析 o 3.踩坑心得: o 4.改进建议 o 5.总结1.前言 这三次题目集的主要考察的知识点是继承和多态,包括对super、extend关键字的使用,方法的重写等。 这三次PTA作业涉及了广泛的知识点,对日常学习积累的要求颇高。在…

什么是 Apache Kafka?

第一部分:数据集成挑战典型的企业通过各种应用程序收集数据,例如会计、计费、客户关系管理、网站等。这些应用程序中的每一个都有自己的数据输入和更新流程。为了获得业务的统一视图,工程师必须在这些不同的应用程序之间开发定制的集成。 这些直接积分可以得到如下所示的复杂…

关于nchu三次题目集7-1题目的总结

关于nchu三次题目集7-1题目的总结 一、前言 关于这三次的题目集,题目为家具强电器电路模拟程序,前提是在如今只能家具越来越流行的情况下,使用模拟程序控制智能家居强电器电路就很有必要,此次题目是考究的是我们对复杂问题的分析与处理能力,需要将串联电路以及并联电路模拟…

23201813-第二次pta-blog作业

前言: 在经过这一两个月的java学习,我对于java的认知和理解和刚开始学习的时候已经有很大不同,java可以更好的用面向对象技术来写程序,pta里的题每周都像一个小程序一样,就像是c语言的课设,每周一个,再加上我学艺不精,所以有的题目集没写或者没得到多少分,尤其是这三次…

Docker配置代理拉取镜像

国内环境越来越严峻,大部分国内镜像站都g了,因此记录一下Docker成功配置代理的步骤。运行以下命令,需要修改proxy.example.com:8080为你实际的代理地址sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/proxy.conf <&…

OOP第二次Blog

前言 (1) 第四次题集的第一题已经经过了三次迭代,需要考虑到的情况越来越复杂,难度也越来越大,这让我感受到面向对象编程的基本原则的重要性,此前每一次迭代都应该谨慎,切忌为了偷懒就破坏类之间的关系(我第二次迭代就偷懒过了所有测试点,然后最后一次就狂改)。 (2)…

Vue CLI 4与项目构建实战指南

这篇文章介绍了如何使用Vue CLI优化项目构建配置,提高开发效率,涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构…

2024.6.6学习java算法

java--- 对象赋值: 新建类class person包含String name和int age两个属性 在main方法中new person xiaoming,name为"xiaoming",age为19。 new person tiedan,tiedan=xiaoming。 输出tiedan的属性得到"xiaoming,19" tiedan.name="tiedan" 输出…

函数递归调用栈process

ret2text n步过 s步进 EIP所指的位置即为当前程序运行的位置gdb的栈地址顺序上高下底 s起始地址与ebp为0x18-0x08=0x10=16*bA 整数打包为字节 shellcode 我们现在做的很多题目,都是堆栈不可执行,如果要使堆栈可执行,就要用到修改内存属性的函数,这属于比较高级的利用方式,…

pwntool类型转换

pwntools:类型转换 编码是什么?编码就是把一个字符用一个二进制来表示。 以ASCII编码为例,它规定1个字节8个比特位代表1个字符的编码,也就是"00000000"这么宽,一个一个字节的解读。例如:01000001表示大写字母A,有时我们会“偷懒"的用65这个十进制来表示A…

git-jenkins阶段01 DevOps介绍, 版本控制系统, Git的安装与应用(内容对比,历史记录,恢复,分支)

1.DevOps介绍铁三角 开发 测试 运维老板的想法 产品经理的构造 开发的代码实现 测试的功能测试 运维平台构建 代码的上线开发 测试 变化 代码的更新 运维 稳定 网站能够正常运行下去2. 版本控制系统vcs 记录文件的所有的历史变化 随时…