[Python系列-10]:Python之人工智能 - 基本工具 -4- 数组与矩阵数学工具Numpy
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python系列-10]:Python之人工智能 - 基本工具 -4- 数组与矩阵数学工具Numpy相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119281620
目录
3.4 从已有数组创建新数组:numpy.asarray()
3.5 从一段范围内创建新数组:numpy.arange() =》使用广泛
3.7 构建l等比数列的数组:numpy.logspace()
4.2 创建随机数矩阵:numpy.matlib.rand()
4.3 创建全0的矩阵:numpy.matlib.zeros()
4.4 创建全1的矩阵:numpy.matlib.ones()
4.5 对角线为1的矩阵:numpy.matlib.eye()
4.6 单位矩阵:numpy.matlib.identity()
第1章 Numpy简介
1.1 什么是矩阵?
在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。
1.2 什么是数组?
数组(Array)是有序的相同数据类型元素序列的集合。
1.3 数组与矩阵的异同
(1)相同点
- 结构化数据相同:都是用来存储、管理相同类型的结构化数据
- 数据的存放方式相同:按照维度来管理数据的
- 数据的访问方式类似:都是通过下标进行范围个别元素
(2)不同点
- 目的不同:数组主要用户存储和管理数据,矩阵用于存储数据和数据数学运算。
- 维度不同:数组是任意维度的,而矩阵通常是1维和2维的。
- 运算不同:数组和数组之间可以进行线性运算,而矩阵与矩阵之间,可以进行矩阵运算。
- 内容不同:数组存储的数据可以是数字,也可以是非数字;矩阵存储的是数字。
- 范围不同:多维数组范围更广,包括线性代数的运算,矩阵仅限于矩阵相乘运算。
1.4 什么是Numpy?
NumPy(Numerical Python)是Python的一种开源的数值计算扩展。
这种工具可用来:
- 存储和处理大型数组和矩阵,比Python自身的嵌套列表(nested list structure)结构要高效很多。Numpy是组织、管理、操作按照矩阵形式组织的大规模、结构化数据非常有效的Python工具。
- 针对数组提供大量的数学函数库,支持大量维度数组的数学运算。
- 针对矩阵提供大量的数学函数库,支持大量维度矩阵的数学运算。
备注:本文重点关注数组数据与矩阵数据的创建与管理,至于它们的数学运算,在数学人工智能的数学基础章节中再进一步的探讨。
Numpy同时支持数组与矩阵:
- 数组:np.array
- 矩阵:np.matlib
Numpy中数组与矩阵的互转
矩阵总是二维的,而 ndarray 是一个 n 维数组。 两个对象都是可互换的。
- 矩阵转为数组:np.asarray
- 数组转为矩阵:np.asmatrix
主页:https://www.runoob.com/numpy/numpy-linear-algebra.html
安装:Anaconda: 免费 Python 发行版,用于进行大规模数据处理、预测分析,和科学计算,致力于简化包的管理和部署。支持 Linux, Windows 和 Mac 系统。
1.5 Numpy与深度学习
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
熟悉NumPy库的使用是学习人工智能矩阵运算最好的途径。
第2章 numpy数组库
2.1 numpy数组array概述
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。
ndarray 内部由以下内容组成:
-
一个指向数据(内存或内存映射文件中的一块数据)的指针。
-
数据类型或 dtype,描述在数组中的固定大小值的格子。
-
一个表示数组形状(shape)的元组,表示各维度大小的元组。
ndarray 的内部结构:
2.2 array数组对象的定义
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数说明:
名称 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
实例
接下来可以通过以下实例帮助我们更好的理解。
实例 1
import numpy as np
a = np.array([1,2,3])
print (a)
输出结果如下:
[1 2 3]
实例 2
# 多于一个维度
import numpy as np
a = np.array([[1, 2], [3, 4]])
print (a)
输出结果如下:
[[1 2]
[3 4]]
实例 3
# 最小维度
import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
print (a)
输出如下:
[[1 2 3 4 5]]
实例 4
# dtype 参数
import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print (a)
输出结果如下:
[1.+0.j 2.+0.j 3.+0.j]
ndarray 对象由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置。内存块以行顺序(C样式)或列顺序(FORTRAN或MatLab风格,即前述的F样式)来保存元素。
2.3 数组的属性
NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。
在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。
所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。
很多时候可以声明 axis。
axis=0,表示沿着第 0 轴进行操作,即对每一列所有行数据进行操作;
axis=1,表示沿着第 1 轴进行操作,即对每一行所有列数据进行操作。
AXIS 0 轴是沿着行(rows)的方向
在NumPy数组中,axis 0 是第一轴。对于二维或多维数组,axis 0 是沿行(row)向下的轴。(一维数组是特例,不适用此处解释,后续讲解)
AXIS 1 轴是沿着列(columns)的方向
在NumPy数组中,axis 1 是第2根轴。对于二维或多维数组,axis 1 是沿列(columns)横穿的轴。
NumPy 的数组中比较重要 ndarray 对象属性有:
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray 对象的内存信息 |
ndarray.real | ndarray元素的实部 |
ndarray.imag | ndarray 元素的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。 |
第3章 创建并初始化特定的数组
3.1 创建一个未初始化数组:numpy.empty
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
import numpy as np
x = np.empty([3,2], dtype = int)
print (x)
输出结果为:
[[ 6917529027641081856 5764616291768666155]
[ 6917529027641081859 -5764598754299804209]
[ 4497473538 844429428932120]]
3.2 创建一个全0的数组:numpy.zeros
创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = 'C')
实例:
import numpy as np
# 默认为浮点数
x = np.zeros(5)
print(x)
# 设置类型为整数
y = np.zeros((5,), dtype = np.int)
print(y)
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print(z)
输出结果为:
[0. 0. 0. 0. 0.]
[0 0 0 0 0]
[[(0, 0) (0, 0)]
[(0, 0) (0, 0)]]
3.3 创建全1的数组: numpy.ones
创建指定形状的数组,数组元素以 1 来填充:
numpy.ones(shape, dtype = None, order = 'C')
实例:
import numpy as np
# 默认为浮点数
x = np.ones(5)
print(x)
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)
输出结果为:
[1. 1. 1. 1. 1.]
[[1 1]
[1 1]]
3.4 从已有数组创建新数组:numpy.asarray()
import numpy as np
x = [1,2,3]
a = np.asarray(x)
print (a)
输出结果为:
[1 2 3]
3.5 从一段范围内创建新数组:numpy.arange() =》使用广泛
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)
根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 等差数列ndarray。(差指定,个数未指定)
参数说明:
参数 | 描述 |
---|---|
start | 起始值,默认为0 |
stop | 终止值(不包含) |
step | 步长,默认为1 |
dtype | 返回ndarray 的数据类型,如果没有提供,则会使用输入数据的类型。 |
#实例:
import numpy as np
x = np.arange(5)
print (x)
输出结果如下:
[0 1 2 3 4]
3.6 构建等差数列数组:numpy.linspace()
numpy.linspace 函数根据 start 与 stop 指定的范围以及元素的个数num,生成一个 等差数列ndarray(差未指定,个数指定)。
格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数说明:
参数 | 描述 |
---|---|
start | 序列的起始值 |
stop | 序列的终止值,如果endpoint 为true ,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为 true 时,数列中包含stop 值,反之不包含,默认是True。 |
retstep | 如果为 True 时,生成的数组中会显示间距,反之不显示。 |
dtype | ndarray 的数据类型 |
3.7 构建l等比数列的数组:numpy.logspace()
numpy.logspace 函数用于创建一个于等比数列。格式如下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
base 参数意思是取对数的时候 log 的下标。
参数 | 描述 |
---|---|
start | 序列的起始值为:base ** start |
stop | 序列的终止值为:base ** stop。如果endpoint 为true ,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为 true 时,数列中中包含stop 值,反之不包含,默认是True。 |
base | 对数 log 的底数。默认10. |
dtype | ndarray 的数据类型 |
#实例
import numpy as np
# 默认底数是 10
a = np.logspace(1.0, 2.0, num = 10)
print (a)
输出结果为:
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
第4章 numpy的矩阵库
NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。
4.1 创建空矩阵:matlib.empty()
(1)说明
所谓空矩阵,是指矩阵的数据未初始化,是不确定的
注意:不确定不是指随机数,而是指取决于当时的内容空间的实际值。
(2)格式
matlib.empty() 函数返回一个新的矩阵,语法格式为:
numpy.matlib.empty(shape, dtype, order)
参数说明:
- shape: 定义新矩阵形状的整数或整数元组
- Dtype: 可选,数据类型
- order: C(行序优先) 或者 F(列序优先)
(3)案例
#实例
import numpy.matlib
import numpy as np
print (np.matlib.empty((2,2)))
# 填充为随机数据
# 输出结果为:
[[-1.49166815e-154 -1.49166815e-154]
[ 2.17371491e-313 2.52720790e-212]]
4.2 创建随机数矩阵:numpy.matlib.rand()
numpy.matlib.rand() 函数创建一个给定大小的矩阵,数据是随机填充的。
#实例
import numpy.matlib
import numpy as np
print (np.matlib.rand(3,3))
#输出结果为:
[[0.23966718 0.16147628 0.14162 ]
[0.28379085 0.59934741 0.62985825]
[0.99527238 0.11137883 0.41105367]]
4.3 创建全0的矩阵:numpy.matlib.zeros()
numpy.matlib.zeros() 函数创建一个以 0 填充的矩阵。
#实例
import numpy.matlib
import numpy as np
print (np.matlib.zeros((2,2)))
#输出结果为:
[[0. 0.]
[0. 0.]]
4.4 创建全1的矩阵:numpy.matlib.ones()
numpy.matlib.ones()函数创建一个以 1 填充的矩阵。
实例
import numpy.matlib
import numpy as np
print (np.matlib.ones((2,2)))
#输出结果为:
[[1. 1.]
[1. 1.]]
4.5 对角线为1的矩阵:numpy.matlib.eye()
numpy.matlib.eye() 函数返回一个矩阵,对角线元素为 1,其他位置为零。
numpy.matlib.eye(n, M,k, dtype)
参数说明:
- n: 返回矩阵的行数
- M: 返回矩阵的列数,默认为 n
- k: 对角线的索引
- dtype: 数据类型
#实例
import numpy.matlib
import numpy as np
print (np.matlib.eye(n = 3, M = 4, k = 0, dtype = float))
#输出结果为:
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]]
4.6 单位矩阵:numpy.matlib.identity()
#实例
import numpy.matlib
import numpy as np
# 大小为 5,类型位浮点型
print (np.matlib.identity(5, dtype = float))
#输出结果为:
[[ 1. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 0.]
[ 0. 0. 1. 0. 0.]
[ 0. 0. 0. 1. 0.]
[ 0. 0. 0. 0. 1.]]
第5章 numpy数组与矩阵的公共操作
5.1 矩阵转数组:asarray()
#实例
import numpy.matlib
import numpy as np
i = np.matrix('1,2;3,4')
print (i)
#输出结果为:
[[1 2]
[3 4]]
import numpy.matlib
import numpy as np
j = np.asarray(i)
print (j)
#输出结果为:
[[1 2]
[3 4]]
5.2 数组转矩阵:asmatrix ()
#实例
import numpy.matlib
import numpy as np
k = np.asmatrix (j)
print (k)
输出结果为:
[[1 2]
[3 4]]
5.3 获取数据类型:dtype()
import numpy as np
# 使用标量类型
dt = np.dtype(np.int32)
print(dt)
输出结果为:
int32
5.4 数据的维度:shape()
ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
#实例
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print (a.shape)
#输出结果为:
(2, 3)
5.5 数据的维度的重构:shape()
#实例
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print (a)
a.shape = (3,2)
print (a)
#输出结果为:
[[1 2 3]
[4 5 6]]
[[1 2]
[3 4]
[5 6]]
5.6 数据的维度的重构:reshape()
NumPy 也提供了 reshape 函数来调整数组大小。
numpy.reshape 函数可以在不改变数据的条件下修改形状,
#实例
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print (b)
#输出结果为:
[[1, 2]
[3, 4]
[5, 6]]
待续。。。。。。。。
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119281620
以上是关于[Python系列-10]:Python之人工智能 - 基本工具 -4- 数组与矩阵数学工具Numpy的主要内容,如果未能解决你的问题,请参考以下文章
[Python系列-7]:Python之人工智能 - 基本工具 -1- Time库
[Python系列-9]:Python之人工智能 - 基本工具 -3- 函数可视化工具matplotlib
[Python系列-8]:Python之人工智能 - 基本工具 -2- 随机数生成库
[Python系列-6]:Python之人工智能 - 基本语法-3-程序循环控制语句:for...in,while