18. Python 数据处理之 Numpy

news2024/11/30 3:29:10

目录

    • 1. 简介
    • 2. 安装和导入Numpy
    • 3. ndarray 对象
    • 4. 基本运算
    • 5. 索引、切片和迭代
    • 6. 条件和布尔数组
    • 7. 变换形状
    • 8. 操作数组

1. 简介

数据分析的流程概括起来主要是:读写、处理计算、分析建模和可视化4个部分。

Numpy 是Python 进行科学计算,数据分析时,所用到的一个基础库。它是大量Python数据和科学计算包的基础,如Pandas库就用到了Numpy。

Numpy(Numerical Python)是Python的一个扩展程序库,支持大量的维度数组与矩阵运算,此外,针对数组运算也可以提供大量的数据函数库。

Numpy 是一个运行速度非常快的数学库,主要用于数组计算,包括以下方面:

  • 一个强大的N维数组对象ndarray。
  • 广播功能函数。
  • 整合C/C++/Fortran代码的工具。
  • 线性代数、傅立叶变换、随机数生成功能。

Numpy 通常与 Scipy(Scientific Python)和 Matplotlib(绘图库)一起使用,这种组合广泛用于替代MatLab,是一个强大的科学计算环境,有助于通过Python学习数据科学或者机器学习。

2. 安装和导入Numpy

安装、导入和使用Numpy:

# 安装Numpy
'''Windows 按住win+R 输入 cmd,Mac 打开Terminal
pip install numpy 
'''
import numpy as np # 导入numpy并取别名
print(np.__version__) # 如果显示版本信息,说明安装和导入成功;1.22.1
print(np.eye(3)) # 使用eye(n) 生成对角矩阵
# 输出
'''
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
'''

3. ndarray 对象

ndarray 是 Numpy 库的基础,是一种由同质元素构成的多维数组。元素数量是事先指定好的,同质指的是所有元素的类型和大小都相同。数据类型由dtype(data-type,数据类型)的Numpy对象指定。每个ndarray只有一种dtype类型。

数组的维数和元素的数量由数组的形状(shape)确定,数组的形状由N个正整数组成的元组指定,元组的每个元素对应每一维的大小。数组的维统称为轴(axes),轴的数量被称作秩(rank)。

Numpy 数组的另一个特点是大小固定,在创建数组时指定大小,然后就不再发生改变。这与Python的列表有所不同,列表的大小时可以改变的。

1) 创建ndarray对象

使用array(),通过嵌套列表或元组定义为多维数组。

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

参数说明如下:

  • object:数组或嵌套的数列。
  • dtype:数组元素的数据类型,可选。
  • copy:对象是否需要复制,可选。
  • order:创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)。
  • subok:默认返回一个与基类类型一致的数组。
  • ndmin:指定生产数组的最小维度。
import numpy as np # 导入numpy并取别名
a = np.array([1,2,3]) # 定义一维 ndarray 对象
b = np.array([[1,2],[3,4]]) # 定义多维 ndarray 对象
print(a) # 输出 [1 2 3]
print(b) 
''' 输出
[[1 2]
 [3 4]]
'''
print(b.itemsize) # 使用itemsize属性可以获取每个元素的大小(以字节为
print(b.data) # 使用data属性表示包含数组实际元素的缓冲区

使用empty()函数可以创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组。

numpy.empty(shape,dtype=float,order='C')

参数说明如下:

  • shape:数组形状。
  • dtype:数据类型,可选。
  • order:有‘C’和’F’两个选项,分别代表行优先和列优先,在计算机内存中存储元素的顺序。
import numpy as np # 导入numpy并取别名
x = np.empty([2,2],dtype=int) 
print(x)
'''输出
[[1 2]
 [3 4]]
'''

使用zeros(),可以创建指定大小的数组,数组元素初始为0,语法格式和empty()相同。

import numpy as np # 导入numpy并取别名
x = np.zeros([2,2],dtype=int) 
print(x)
'''输出
[[0 0]
 [0 0]]
'''

使用ones(),可以创建指定大小的数组,数组元素初始为1,语法格式和empty()相同。

import numpy as np # 导入numpy并取别名
x = np.ones([2,2],dtype=int) 
print(x)
'''输出
[[1 1]
 [1 1]]
'''

2) 数据类型

Numpy 支持的数据类型比Python内置的类型要多,基本上与C语言的数据类型对应,具体如下:

  • bool:布尔型数据类型(True或False)
  • int:默认的整数类型(类似于C语言中的long、int32或int64)
  • intc:与C的int类型一样,一般是int32或int64
  • intp:用于索引的整数类型(类似于C的ssize_t,一般情况下仍然是int32或int64)
  • int8:字节(-128~127)
  • int16:整数(-32768~32767)
  • int32:整数(-2147483648~2147483647)
  • int64:整数
  • uint8:无符号整数(0~255)
  • uint16:无符号整数(0~65535)
  • uint32:无符号整数(0~4294967295)
  • uint64:无符号整数
  • float:float64类型的简写
  • float16:半精度浮点数,包括1个符号位,5个指数位,10个尾数位
  • float32:单精度浮点数,包括1个符号位,8个指数位,23个尾数位
  • float64:双精度浮点数,包括1个符号位,11个指数位,52个尾数位
  • complex:complex128类型的简写,即128位复数
  • complex64:复数,表示双32位浮点数(实数部分和虚数部分)
  • complex128:复数,表示双64位浮点数(实数部分和虚数部分)

3) 数组属性

Numpy中,每一个线性的数组称为一个轴(axis),也就是维度(dimension)。二维数组相当于两个一维数组,其中一个数组中每个元素又是一个一维数组。包含的主要属性如下:

  • ndarray.ndim:秩,即轴的数量或维度的数量。
  • ndarray.shape:数组的形状,对于矩阵,表示n行m列。
  • ndarray.size:数组元素的总个数,相当于n*m的值。
  • ndarray.dtype:ndarray对象的元素类型。
  • ndarray.itemsize:ndarray对象中每个元素的大小,以字节为单位。
  • ndarray.flags:ndarray对象中每个元素的内存信息。
  • ndarray.real:ndarray元素的实部。
  • ndarray.imag:ndarray元素的虚部。
  • ndarray.data:包含实际数组元素的缓冲区。一般通过数组的索引获取元素,所以通常不需要使用这个属性。
import numpy as np # 导入numpy并取别名
b = np.array([[1,2],[3,4]])
print(b)
'''输出
[[1 2]
 [3 4]]
'''
print(type(b))  # <class 'numpy.ndarray'>
print(b.dtype) # int64
print(b.ndim) # 2
print(b.size) # 4
print(b.shape) # (2, 2)

4. 基本运算

1) 算术运算

import numpy as np 
a = np.array([1,2,3,4])
print(a+2) # [3 4 5 6]
print(a-2) # [-1  0  1  2]
print(a*2) # [2 4 6 8]
print(a/2) # [0.5 1.  1.5 2. ]
b = np.array([2,3,4,5])
print(b-a) # [1 1 1 1]

2) 矩阵积

dot()函数能够返回两个数组的点积。一维数组,位置相同的元素相乘,然后再求和,二维数组(矩阵)之间的运算,则得到的是矩阵积。

a.dot(b)与np.dot(a,b) 效果相同,矩阵积计算不遵循交换律,也就是np.dot(a,b)和np.dot(b,a)得到的结果不一样。

import numpy as np
a = np.array([1,2,3,4])
b = np.array([4,5,6,7])
print(np.dot(a,b))  # 60
c = np.array([[1,2],[3,4]])
d = np.array([[5,6],[7,8]])
print(np.dot(c,d))
'''输出
[[19 22]
 [43 50]]
'''
print(np.dot(d,c))
'''输出
[[23 34]
 [31 46]]
'''

3) 自增和自减

使用+=和-=运算符可以实现数组自增和自减。

import numpy as np
a = np.array([[1,2],[3,4]])
a += 1
print(a)
'''输出
[[2 3]
 [4 5]]
'''

4) 通用函数

三角函数等很多数学运算符符合通用函数的定义,计算平方根的sqrt()函数、用来取对数的log()函数和正弦函数sin()

import numpy as np
a = np.array([[1,2],[3,4]])
print(np.sin(a))
'''输出
[[ 0.84147098  0.90929743]
 [ 0.14112001 -0.7568025 ]]
'''

5) 聚合函数

聚合函数是指对一组值,进行操作,返回一个单一值作为结果的函数。

import numpy as np
a = np.array([[1,2],[3,4]])
print(a.sum()) # 10
print(a.min()) # 1
print(a.max()) # 4
print(a.std()) # 1.118033988749895

5. 索引、切片和迭代

1) 索引

访问单个元素,用法与list类似。

import numpy as np
a = np.array([1,2,3,4])
print(a[2]) # 3
b = np.array([[1,2],[3,4]])
print(b[1,1]) # 4
print(b[-1,-1]) # 4

2) 切片

切片抽取数组的一部分元素并生成新数组。

import numpy as np
a = np.array([range(0,10),range(10,20),range(20,30),range(40,50)])
print(a[1:5,1:7]) # 截取连续局部矩阵
'''输出
[[11 12 13 14 15 16]
 [21 22 23 24 25 26]
 [41 42 43 44 45 46]]
'''
print(a[[1,3],1:7])
'''输出
[[11 12 13 14 15 16]
 [41 42 43 44 45 46]]
'''

3) 迭代

对于一维数组,可以使用for进行迭代;对于二维数组,可以使用嵌套的for进行迭代,外层for扫描行,内层for扫描列。

import numpy as np
a = np.array([[1,2],[3,4]])
for row in a:
    for col in row:
        print(col,end=' ')
print(' ') # 换行

for item in a.flat: # flat 表示数组元素迭代器
    print(item,end=' ')

6. 条件和布尔数组

使用条件表达式和布尔运算符有选择地抽取元素。

import numpy as np
a = np.random.random((4,4))
print(a)
'''输出
[[0.49954069 0.42753987 0.25914236 0.1253001 ]
 [0.48690952 0.35854975 0.07134125 0.2598206 ]
 [0.15511689 0.8465675  0.9928091  0.40122818]
 [0.21870776 0.97000971 0.92714403 0.97068106]]
'''
print(a[a<0.5])
'''输出
[0.49954069 0.42753987 0.25914236 0.1253001  0.48690952 0.35854975
 0.07134125 0.2598206  0.15511689 0.40122818 0.21870776]
'''

7. 变换形状

使用reshape()函数可以改变数组的形状,该函数返回一个新数组。

import numpy as np
a = np.random.random(12)
print(a)
print(a.reshape(3,4))
a.shape = (2,6) # 直接将新形状的元组赋值给shape属性
print(a)

在这里插入图片描述

改变数组形状的操作是可逆的,使用ravel()函数可以把二维数组再变回一维数组。甚至直接改变数组shape属性的值。使用transpose()函数可以实现行、列位置的矩阵转置。

import numpy as np
a = np.array([[1,2],[3,4]])
b = a.transpose() # 行列位置转置
b
''' 输出
array([[1, 3],
       [2, 4]])
'''

8. 操作数组

1) 合并数组

合并数组有以下3种方法:

  • np.concatenate:合并维数相同的两个数组。
  • np.vstack:垂直方向合并一维数组和二维数组。
  • np.hstack:水平方向合并一维数组和二维数组。
a = np.ones((2,2))
b = np.zeros((2,2))
print(np.vstack((a,b))) # 垂直方向
''' 输出
[[1. 1.]
 [1. 1.]
 [0. 0.]
 [0. 0.]]
'''
print(np.hstack((a,b))) # 水平方向
''' 输出
[[1. 1. 0. 0.]
 [1. 1. 0. 0.]]
'''

column_stack()row_stack()两个函数把一维数组作为列或行入栈结构,以形成一个新的二维数组。

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
d = np.column_stack((a,b)) 
print(d)
''' 输出
[[1 4]
 [2 5]
 [3 6]]
'''
e = np.row_stack((a,b))
print(e)
''' 输出
[[1 2 3]
 [4 5 6]]
'''

2) 切分数组

切分数组有以下3种方法:

  • np.split:分割。
  • np.vsplit:垂直分割。
  • np.hsplit:水平分割。
import numpy as np 
a = np.arange(16).reshape(4,4)
print('原数组:')
print(a)
print('默认分割(0轴):')
b = np.split(a,2)
print(b)
print('垂直方向分割:')
c = np.vsplit(a,2)
print(c)
print('水平方向分割:')
d = np.hsplit(a,2)
print(d)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【咕咕送书 | 第六期】深入浅出阐述嵌入式虚拟机原理,实现“小而能”嵌入式虚拟机!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 ⛳️ 写在前面参与规则引言一、为什么嵌入式系统需要虚拟化技术&#xff1f;1.1 专家推荐 二、本书适合谁&#x…

【Vue】@keyup.enter @v-model.trim的用法

目录 keyup.enter v-model.trim 情景一&#xff1a; 情景二&#xff1a; keyup.enter 作用&#xff1a;监听键盘回车事件 上一篇内容&#xff1a; 记事本 https://blog.csdn.net/m0_67930426/article/details/134630834?spm1001.2014.3001.5502 这里有个添加任务的功能&…

ESP32控制数码管实现数字叠加案例

经过了几个小时的接线和代码实现终于搞定了代码&#xff0c;贴出来大家参考下 import machine import time# 定义4个Led的引脚 led1 machine.Pin(5,machine.Pin.OUT) led2 machine.Pin(18,machine.Pin.OUT) led3 machine.Pin(19,machine.Pin.OUT) led4 machine.Pin(21,mac…

i社为什么不出游戏了?

I社&#xff0c;即国际知名的游戏公司&#xff0c;近来为何鲜有新游问世&#xff1f;曾经风靡一时的游戏开发者&#xff0c;如今为何陷入了沉寂&#xff1f;这其中的种种原因&#xff0c;值得我们深入剖析。 首先&#xff0c;I社近期的沉寂可能与其内部管理层的调整和战略规划…

VUE简易购物车程序

目录 效果预览图 完整代码 效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

3.前端--HTML标签-文本图像链接【2023.11.25】

1.HTML常用标签(文本图像链接&#xff09; 文本标签 标题 <h1> - <h6> 段落<p> 我是一个段落标签 </p> 换行 <br /> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta ht…

第一百八十一回 如何绘制阴影效果

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 1. 概念介绍 我们在本章回中介绍的SegmentedButton组件是一种分段式按钮&#xff0c;它把多个按钮连接成一组显示&#xff0c;组内再对不同的按钮进…

Day42力扣打卡

打卡记录 统计子串中的唯一字符&#xff08;找规律&#xff09; 链接 大佬的题解 class Solution:def uniqueLetterString(self, s: str) -> int:ans total 0last0, last1 {}, {}for i, c in enumerate(s):total i - 2 * last0.get(c, -1) last1.get(c, -1)ans tot…

【Java】循环语句练习

文章目录 1. 计算5的阶乘2. 计算 1! 2! 3! 4! 5!3. 数字9 出现的次数4. 判定素数5. 求1-100之间的素数6. 求2个整数的最大公约数7. 计算分数的值8. 模拟登陆9. 输出乘法口诀表10. 求出0&#xff5e;999之间的所有“水仙花数”并输出11. 猜数字游戏&#x1f648; 1. 计算5的…

GWAS:plink进行meta分析

之前教程提到过Metal是可以做Meta分析&#xff0c;除了Metal&#xff0c;PLINK也可以进行Meta分析。 命令如下所示&#xff1a; plink --meta-analysis gwas1.plink gwas2.plink gwas3.plink logscale qt --meta-analysis-snp-field SNP --meta-analysis-chr-field CHR --me…

C++初识类和对象

前言 上一期我们介绍了一些C入门的基础知识&#xff0c;本期我们来介绍面向对象。初步认识一下面向对象和面向过程、类、以及封装&#xff01; 本期内容介绍 面向过程和面向对象 类的引入 类的定义 类的访问限定符和封装 类的作用域 类的实例化 类对象模型 this指针 一、面向…

从零开始学习管道:管道程序的优化和文件描述符继承问题

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容管道后续的完善&#xff0c;以及解决管道继承多个文件描…

Unity - Graphic解析

Gpahic 的作用 Graphic 是 Unity最基础的图形基类。主要负责UGUI的显示部分。 由上图可以看你出我们经常使用的Image&#xff0c;Text&#xff0c;都是继承自Graphic。 Graphic的渲染流程 在Graphic的源码中有以下属性 [NonSerialized] private CanvasRenderer m_CanvasRend…

【Python游戏开发】使用Python编写拼图益智游戏教程

使用Python编写拼图益智游戏 大家一般都玩过拼图益智游戏&#xff0c;或者类似的游戏。今天&#xff0c;就给大家使用pygame库在Python中构建一个拼图益智小游戏。这个拼图小游戏是构建一个围绕着将1-15个数字排列在16个方块的网格中的游戏。 现在&#xff0c;让我们从今天的惊…

【数据中台】开源项目(2)-Dbus数据总线

1 背景 企业中大量业务数据保存在各个业务系统数据库中&#xff0c;过去通常的同步数据的方法有很多种&#xff0c;比如&#xff1a; 各个数据使用方在业务低峰期各种抽取所需数据&#xff08;缺点是存在重复抽取而且数据不一致&#xff09; 由统一的数仓平台通过sqoop到各个…

那些年,关于CKACKS认证的那些事儿?

前言 遥想2020年的年初&#xff0c;疫情封城封村之际&#xff0c;工作之余在B站将尚硅谷的linux中的k8s视频完整系统的学习了一遍&#xff0c;自此像是打通了任督二脉一般&#xff0c;开启了对k8s的探索之旅&#xff0c;一路也是磕磕绊绊的在工作中使用k8s。 终于在23年的6月仲…

Rust在Web开发中的应用

欢迎关注我的公众号lincyang新自媒体&#xff0c;回复关键字【程序员经典书单】&#xff0c;领取程序员的100本经典书单 大家好&#xff01;我是lincyang。 今天我们将一起深入探索Rust在Web开发领域的应用。尽管Rust最初设计用于系统编程&#xff0c;但其性能、安全性和现代并…

CANdelaStudio 使用教程5 编辑DID

文章目录 在哪编辑DID的分类编辑快照数据添加 DID 在哪编辑 DID的分类 编辑快照数据 添加 DID

带你用uniapp从零开发一个仿小米商场_9. 轮播图组件封装及使用

导航栏有了,接下来就是轮播图了,轮播图如下, 因为uniapp 官方自己有轮播图,所以这里就不自己写了,直接使用uniapp的轮播图二次开发就好 uniapp的轮播图组件叫swiper ,感兴趣的朋友可以点击链接,直接去看官方文档,也可以看我这里实操 用hbuilderX编译uniapp的代码有一个好处…

redis实现消息延迟队列

业务场景 在很多软件系统功能中都会出现定时任务的业务场景,比如提前点单,比如定时发布动态,文章等而出现这样的的定时的任务为延迟队任务 代码模块 任务的持久化一般都需要建立一个任务表和任务日志表,避免宕机导致任务失效,先新建立一个数据库,创建基本的任务表和任务日志表…