Python 全栈体系【四阶】(一)

四阶:机器学习 - 深度学习

第一章 numpy

一、numpy 概述

Numerical Python,数值的 Python,补充了 Python 语言所欠缺的数值计算能力。

Numpy 是其它数据分析及机器学习库的底层库。

Numpy 完全标准 C 语言实现,运行效率充分优化。

Numpy 开源免费。

1. numpy 历史

1995 年,Numeric,Python 语言数值计算扩充。

2001 年,Scipy->Numarray,多维数组运算。

2005 年,Numeric+Numarray->Numpy。

2006 年,Numpy 脱离 Scipy 成为独立的项目。

2. numpy 的核心:多维数组 + 数值计算

代码简洁:减少 Python 代码中的循环。

底层实现:厚内核(C)+薄接口(Python),保证性能。

二、numpy 基础

ndarray 数组

1. 内存中的 ndarray 对象

元数据(metadata)

  • 存储对目标数组的描述信息,如:ndim、dimensions、dtype、data 等。

实际数据

  • 完整的数组数据

  • 将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数据的访问频率,提高性能。

2. ndarray 数组对象的特点

Numpy 数组是同质数组,即所有元素的数据类型必须相同

Numpy 数组的下标从 0 开始,最后一个元素的下标为数组长度减 1

3. ndarray 数组对象的创建

np.array(任何可被解释为 Numpy 数组的逻辑结构)

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

np.arange(起始值(0),终止值,步长(1))

import numpy as np
a = np.arange(0, 5, 1)
print(a) # [0 1 2 3 4]
b = np.arange(0, 10, 2)
print(b) # [0 2 4 6 8]

np.zeros(数组元素个数, dtype=‘类型’)

import numpy as np
a = np.zeros(10)
print(a) # [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

np.ones(数组元素个数, dtype=‘类型’)

import numpy as np
a = np.ones(10)
print(a) # [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
4. ndarray 对象属性的基本操作

数组的维度: np.ndarray.shape

import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.shape) # <class 'numpy.ndarray'> [1 2 3 4 5 6] (6,)
#二维数组
ary = np.array([[1,2,3,4],[5,6,7,8]
])
print(type(ary), ary, ary.shape)
"""
<class 'numpy.ndarray'> [[1 2 3 4][5 6 7 8]] (2, 4)
"""

元素的类型: np.ndarray.dtype

import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.dtype) # <class 'numpy.ndarray'> [1 2 3 4 5 6] int64
#转换ary元素的类型
b = ary.astype(float)
print(type(b), b, b.dtype)	# <class 'numpy.ndarray'> [1. 2. 3. 4. 5. 6.] float64
#转换ary元素的类型
c = ary.astype(str)
print(type(c), c, c.dtype)	# <class 'numpy.ndarray'> ['1' '2' '3' '4' '5' '6'] <U21

数组元素的个数: np.ndarray.size

import numpy as np
ary = np.array([[1,2,3,4],[5,6,7,8]
])
#观察维度,size,len的区别
print(ary.shape, ary.size, len(ary)) # (2, 4) 8 2

数组元素索引(下标)

  • 数组对象[…, 页号, 行号, 列号]

  • 下标从 0 开始,到数组 len-1 结束。

import numpy as np
a = np.array([[[1, 2],[3, 4]],[[5, 6],[7, 8]]])
print(a, a.shape)
print(a[0])
print(a[0][0])
print(a[0][0][0])
print(a[0, 0, 0])
for i in range(a.shape[0]):for j in range(a.shape[1]):for k in range(a.shape[2]):print(a[i, j, k])"""
[[[1 2][3 4]][[5 6][7 8]]] (2, 2, 2)
[[1 2][3 4]]
[1 2]
1
1
1
2
3
4
5
6
7
8
"""
5. ndarray 对象属性操作详解

Numpy 的内部基本数据类型

类型名类型表示符
布尔型bool_
有符号整数型int8(-128~127) / int16 / int32 / int64
无符号整数型uint8(0~255) / uint16 / uint32 / uint64
浮点型float16 / float32 / float64
复数型complex64 / complex128
字串型str_,每个字符用 32 位 Unicode 编码表示
日期类型datetime64

自定义复合类型

列与列之间可以是不同的类型,但是在同一列内,类型必须

# 自定义复合类型
import numpy as npdata=[('zs', [90, 80, 85], 15),('ls', [92, 81, 83], 16),('ww', [95, 85, 95], 15)
]
#第一种设置dtype的方式
a = np.array(data, dtype='U3, 3int32, int32')
print(a)
print(a[0]['f0'], ":", a[1]['f1'])
print("=====================================")#第二种设置dtype的方式
c = np.array(data, dtype={'names': ['name', 'scores', 'ages'],'formats': ['U3', '3int32', 'int32']})
print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize)
print("=====================================")#测试日期类型数组
f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01'])
f = f.astype('M8[D]')
f = f.astype('i4')
print(f[3]-f[0])f.astype('bool')"""
[('zs', [90, 80, 85], 15) ('ls', [92, 81, 83], 16)('ww', [95, 85, 95], 15)]
zs : [92 81 83]
=====================================
zs : [90 80 85] : 28
=====================================
31
"""

类型字符码

类型字符码
np.bool_?
np.int8/16/32/64i1 / i2 / i4 / i8
np.uint8/16/32/64u1 / u2 / u4 / u8
np.float/16/32/64f2 / f4 / f8
np.complex64/128c8 / c16
np.str_U
np.datetime64M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]
  • 不会修改原始数据的维度
    • 视图变维
      • 数据共享
    • 复制变维
      • 数据独立
  • 直接修改原始数据的维度
    • 就地变维
5.1 ndarray 数组维度操作

视图变维(数据共享): reshape() 与 ravel()

import numpy as np
a = np.arange(1, 9)
print(a)		# [1 2 3 4 5 6 7 8]
b = a.reshape(2, 4)	#视图变维  : 变为2行4列的二维数组
print(b)
c = b.reshape(2, 2, 2) #视图变维    变为2页2行2列的三维数组
print(c)
d = c.ravel()	#视图变维	变为1维数组
print(d)
"""
[1 2 3 4 5 6 7 8]
[[1 2 3 4][5 6 7 8]]
[[[1 2][3 4]][[5 6][7 8]]]
[1 2 3 4 5 6 7 8]
"""

复制变维(数据独立): flatten()

e = c.flatten()
print(e)
a += 10
print(a, e, sep='\n')
"""
[1 2 3 4 5 6 7 8]
[11 12 13 14 15 16 17 18]
[1 2 3 4 5 6 7 8]
"""

就地变维:直接改变原数组对象的维度,不返回新数组

a.shape = (2, 4)
print(a)
a.resize(2, 2, 2)
print(a)
"""
[[11 12 13 14][15 16 17 18]]
[[[11 12][13 14]][[15 16][17 18]]]
"""
5.2 ndarray 数组索引操作,切片

数组对象切片的参数设置与列表切面参数类似

  • 步长+:默认切从首到尾
  • 步长-:默认切从尾到首

数组对象[起始位置:终止位置:步长, …]

  • 默认位置步长:1

三维数组[页的索引,行的索引,列的索引]

三维数组[页的切片,行的切片,列的切片]

import numpy as np
a = np.arange(1, 10)
print(a)  # 1 2 3 4 5 6 7 8 9
print(a[:3])  # 1 2 3
print(a[3:6])   # 4 5 6
print(a[6:])  # 7 8 9
print(a[::-1])  # 9 8 7 6 5 4 3 2 1
print(a[:-4:-1])  # 9 8 7
print(a[-4:-7:-1])  # 6 5 4
print(a[-7::-1])  # 3 2 1
print(a[::])  # 1 2 3 4 5 6 7 8 9
print(a[:])  # 1 2 3 4 5 6 7 8 9
print(a[::3])  # 1 4 7
print(a[1::3])  # 2 5 8
print(a[2::3])  # 3 6 9

多维数组的切片操作

import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)
print(a)
#切出1页
print(a[1, :, :])
#切出所有页的1行
print(a[:, 1, :])
#切出0页的1行1列
print(a[0, :, 1])"""
[[[ 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]]]
[[10 11 12][13 14 15][16 17 18]]
[[ 4  5  6][13 14 15][22 23 24]]
[2 5 8]
"""

ndarray 数组的掩码操作

import numpy as np
a = np.arange(1, 10)
mask = [True, False,True, False,True, False,True, False,True]
print(a[mask])	# [1 3 5 7 9]
6. 多维数组的组合与拆分

垂直方向操作:

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)
print(a)
print(b)
print(c)
print(d)
print(e)
"""
[[1 2 3][4 5 6]]
[[ 7  8  9][10 11 12]]
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12]]
[[1 2 3][4 5 6]]
[[ 7  8  9][10 11 12]]
"""

水平方向操作:

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 水平方向完成组合操作,生成新数组
c = np.hstack((a, b))
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)
print(a)
print(b)
print(c)
print(d)
"""
[[1 2 3][4 5 6]]
[[ 7  8  9][10 11 12]]
[[ 1  2  3  7  8  9][ 4  5  6 10 11 12]]
[[1 2 3][4 5 6]]
[[ 7  8  9][10 11 12]]
"""

深度方向操作:(3 维)

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 深度方向(3维)完成组合操作,生成新数组
i = np.dstack((a, b))
# 深度方向(3维)完成拆分操作,生成两个数组
k, l = np.dsplit(i, 2)
"""
[[1 2 3][4 5 6]]
[[ 7  8  9][10 11 12]]
[[[ 1  7][ 2  8][ 3  9]][[ 4 10][ 5 11][ 6 12]]]
[[[1][2][3]][[4][5][6]]]
[[[ 7][ 8][ 9]][[10][11][12]]]
"""

多维数组组合与拆分的相关函数:

# 通过axis作为关键字参数指定组合的方向,取值如下:
# 若待组合的数组都是二维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
# 若待组合的数组都是三维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
#	2: 深度方向组合
res = np.concatenate((a, b), axis=0)
print(res)
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
result = np.split(c, 2, axis=0)
print(result)
"""
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12]]
[array([[1, 2, 3],[4, 5, 6]]), array([[ 7,  8,  9],[10, 11, 12]])]
"""
7. ndarray 类的其他属性

shape - 维度

dtype - 元素类型

size - 元素数量

ndim - 维数,

itemsize - 元素字节数

nbytes - 总字节数 = size x itemsize

real - 复数数组的实部数组

imag - 复数数组的虚部数组

T - 数组对象的转置视图

flat - 扁平迭代器

import numpy as np
a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],[4 + 2j, 5 + 5j, 6 + 8j],[7 + 3j, 8 + 6j, 9 + 9j]])
print(a.shape)
print(a.dtype)
print(a.ndim)
print(a.size)
print(a.itemsize)
print(a.nbytes)
print(a.real, a.imag, sep='\n')
print(a.T)
print([elem for elem in a.flat])
b = a.tolist()
print(b)"""
(3, 3)
complex128
2
9
16
144
[[1. 2. 3.][4. 5. 6.][7. 8. 9.]]
[[1. 4. 7.][2. 5. 8.][3. 6. 9.]]
[[1.+1.j 4.+2.j 7.+3.j][2.+4.j 5.+5.j 8.+6.j][3.+7.j 6.+8.j 9.+9.j]]
[(1+1j), (2+4j), (3+7j), (4+2j), (5+5j), (6+8j), (7+3j), (8+6j), (9+9j)]
[[(1+1j), (2+4j), (3+7j)], [(4+2j), (5+5j), (6+8j)], [(7+3j), (8+6j), (9+9j)]]
"""

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

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

相关文章

面试数据库八股文十问十答第一期

面试数据库八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 1.MySQL常见索引、 MySQL常见索引有: 主键索引、唯一索引、普通索引、全文索引、组合索引(最左前缀)主键索引特点&#xff1a;唯一性&#xff0c;非空&#xff0c;自增&#xff08;如果使用…

Ubuntu 安装 MySQL8 配置、授权、备份、远程连接

目录 0100 系统环境0200 下载0300 安装0400 服务管理0401 关闭、启动、重启服务0402 查看服务状态 0500 查看配置文件0600 账号管理0601 添加账号0602 删除账号0603 修改密码0604 忘记root密码 0700 自动备份0800 远程访问 0100 系统环境 [rootlocalhost ~]# cat /proc/versio…

338. 比特位计数

338. 比特位计数 和1相与就是1的个数。 class Solution {public int[] countBits(int n) {int[] count new int[n1];for(int i0; i<n;i) {int ji;int cnt 0;while(j!0){if((j&1) ! 0)cnt ;j>>1;}count[i] cnt;}return count;} }

【Python常用的循环】

Python 中有多种类型的循环语句&#xff0c;通常情况下&#xff0c;使用哪种循环取决于迭代对象的类型和循环的逻辑需要。下面是 Python 中常用的循环语句&#xff1a; for 循环&#xff1a;用于遍历序列&#xff08;如列表、元组、字符串&#xff09;或其他可迭代对象中的每一…

AD生产BOM表时如何隐藏不需要的器件记录

在完成图纸设计号通常需要生产BOM表&#xff0c;以便采购等&#xff0c;如果不做一些操作&#xff0c;往往输出的BOM表中包含一些非需要采购的器件&#xff0c;如下图 这时就需要对原理图或者PCB图做一些处理&#xff0c;以原理图为例&#xff0c;在需要屏蔽的器件上双击&#…

Nginx实现多虚拟主机配置

Nginx实现多虚拟主机配置 Nginx为什么要进行多虚拟主机配置呢&#xff1f;what&#xff1f; Nginx实现多虚拟主机配置的主要原因是&#xff0c;一个服务器可能会承载多个网站或应用程序&#xff0c;这些网站或应用程序需要使用不同的域名或IP地址来进行访问。如果只有一个虚拟…

Linux /etc/hosts文件

Linux的 /etc/hosts 文件用于静态地映射主机名到 IP 地址。 通常用于本地网络中的名称解析&#xff0c;它可以覆盖 DNS 的设置。当你访问一个域名时&#xff0c;系统会首先检查 /etc/hosts 文件&#xff0c;如果找到了匹配项&#xff0c;就会使用该 IP 地址&#xff0c;否则会…

ctfhub技能树_web_web前置技能_HTTP

目录 一、HTTP协议 1.1、请求方式 1.2、302跳转 1.3、Cookie 1.4、基础认证 1.5、响应包源代码 一、HTTP协议 1.1、请求方式 注&#xff1a;HTTP协议中定义了八种请求方法。这八种都有&#xff1a;1、OPTIONS &#xff1a;返回服务器针对特定资源所支持的HTTP请求方法…

通过查看ThreadLocal的源码进行简单理解

目录 为什么要使用ThreadLocal&#xff1f; 简单案例 ThreadLocal源码分析 断点跟踪 为什么要使用ThreadLocal 在多线程下&#xff0c;如果同时修改公共变量可能会存在线程安全问题&#xff0c;JDK虽然提供了同步锁与Lock等方法给公共访问资源加锁&#xff0c;但在高并发…

力扣 --- H指数

题目描述&#xff1a; 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff…

【HDFS】调试慢节点pipiline ack信息

Client - DN1 - DN2 - DN3 DN3 send ack:[0][d3]。 DN2 send ack: [从dn2入队到收到dn3的ack耗时,0] [d2,d3]。 DN1 send ack: [pkt从dn1入队到收到dn2的ack耗时,pkt从dn2入队到收到dn3的ack耗时,0] [d1,d2,d3]。 Client receive: 就是DN1发送过来数据。 客户端收到的第一个…

【论文笔记】Universal Guidance for Diffusion Models

Abstract 典型的扩散模型经过训练以接受特定形式的条件作用&#xff08;最常见的是文本&#xff09;&#xff0c;并且如果不经过重新训练就不能接受其他形式的条件的作用。 这项工作中提出了一种通用制导算法(universal guidance algorithm)&#xff0c;使扩散模型能够通过任意…

python弹球小游戏

import pygame import random# 游戏窗口大小 WIDTH 800 HEIGHT 600# 定义颜色 WHITE (255, 255, 255) BLACK (0, 0, 0) RED (255, 0, 0) GREEN (0, 255, 0) BLUE (0, 0, 255)# 球的类 class Ball:def __init__(self):self.radius 10self.speed [random.randint(2, 4),…

ElasticSearch之Delete index API

删除指定的索引。 同时删除索引关联的数据、分片、元数据等相关的资源&#xff0c;因此执行前需要慎重。 命令样例如下&#xff1a; curl -X DELETE "https://localhost:9200/testindex_003?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elasti…

4-Docker命令之docker pause

1.docker pause介绍 docker pause命令是用来暂停docker容器中的所有进程 2.docker pause用法 docker pause [参数] container [container......] [root@centos79 ~]# docker pause --helpUsage: docker pause CONTAINER [CONTAINER...]Pause all processes within one or …

DELL EMC unity 存储系统日志收集方法

对于一些非简单的硬件故障&#xff0c;解决故障最有效、最快速的方法就是收集日志&#xff0c;而不是瞎搞。常见的乱搞方法就是 1. reimage系统‘ 2. 更换控制器&#xff1b;3&#xff0c; 重启。 本文详细介绍了图形界面GUI和命令行CLI下如何收集DELL EMC Unity日志的方法和常…

Spring Cloud笔记 —— 什么是Spring Cloud?

引言&#xff1a; 在写这篇博客之前&#xff0c;其实吧&#xff0c;博主很久之前有过一段时间的Spring Cloud的案例项目开发经验&#xff0c;就是一个案例项目开发而已&#xff0c;也说不上有多高大上&#xff0c;那个时候&#xff0c;我其实也是从众而已罢了&#xff0c;毕竟现…

微信小程序:input双向绑定

微信小程序&#xff1a;input双向绑定 微信小程序&#xff1a;input双向绑定1 数据容器准备2 输入组件准备3 逻辑代码准备4 总结实战示例1.wxml文件导入2.js文件导入 微信小程序&#xff1a;input双向绑定 <说明> PS&#xff1a;该笔记采用渐进式编程&#xff0c;使每一步…

LLM;超越记忆《第 2 部分 》

一、说明 在这篇博客中&#xff0c;我深入研究了将大型语言模型&#xff08;LLM&#xff09;提升到基本记忆之上的数学框架。我们探索了动态上下文学习、连续空间插值及其生成能力&#xff0c;揭示了 LLM 如何理解、适应和创新超越传统机器学习模型。 LLM代表了人工智能的重大飞…

DDD系列 - 第4讲 从架构师的角度看待DDD - 一个关于拆解、微服务、面向对象的故事(二)

目录 第3次拆解 - 面向对象分析与设计3.1 交互入口实现层3.2 面向对象分析3.2.1 根据业务映射类3.2.2 对象持久化仓库3.2.3 自定义属性类3.2.4 类间的关联关系3.2.5 分包提升内聚、包内指定入口类降低耦合3.2.6 定义交互出口3.3 流程编排 & 业务编排3.4 交互出口实现层 &am…