Numpy库

0.1 NumPy 安装

  • pip 安装命令行执行:pip install numpy

  • Anaconda 平台安装:conda install numpy

  • 安装完成测试:import numpy, 如果安装完成导入之后不报错,则证明安装成功。

0.2 NumPy 基本数据类型

  • bool_ 布尔型数据类型(True 或者 False)

  • int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)

  • intc 与 C 的 int 类型一样,一般是 int32 或 int 64

  • intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)

  • int8 字节(-128 to 127)

  • int16 整数(-32768 to 32767)

  • int32 整数(-2147483648 to 2147483647)

  • int64 整数(-9223372036854775808 to 9223372036854775807)

  • uint8 无符号整数(0 to 255)

  • uint16 无符号整数(0 to 65535)

  • uint32 无符号整数(0 to 4294967295)

  • uint64 无符号整数(0 to 18446744073709551615)

  • flfloat_ flfloat64 类型的简写

  • flfloat16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位

  • flfloat32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位

  • flfloat64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位

  • complex_ complex128 类型的简写,即 128 位复数

  • complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)

  • complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)

numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_np.int32,np.flfloat32,等等。

0.3 NumPy 数组

  • NumPy 数组是一个多维数组对象 Ndarray,由数组实际数据与描述这些数据的元数据组成。

  • 一般来说,大部分操作仅针对于元数据,而不改变底层实际的数据。

  • 需要注意的是,NumPy 数组的下标起始位 0,同一个 NumPy 数组中的所有元素类型必须相同,NumPy 数组的创建访问中 () 与 [] 功能没有什么区别。

0.4 NumPy 基础数组创建

NumPy 数组有很多种创建方式,一般常用的方式是将 list 转换为 np.array:

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

输出

array([1, 2, 3])

或者是:

a = np.array([1,2,3], float)
a

输出

array([1, 2, 3])

这里的 float 用于指定数据类型,可以不写,也可以写为 float 等其它类型, 需要注意的是,使用array() 函数创建数组时,参数必须是方括号括起来的列表。

下面创建多维数组

a = np.array([(1,2,3), (4,5,6), (7,8,9)])
a

输出

array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

0.5 NumPy 特殊数组创建

NumPy 提供了一些使用占位符创建数组的函数,这些数组在机器学习中是比较常见的。在创建过程中我们同样可以使用 dtype = int 指定元素类型:

a = np.zeros((2,3), dtype = float)
a

输出

array([[0., 0., 0.],[0., 0., 0.]])

创建一个全为 1 的数组:

a = np.ones((3, 3))
a

输出

array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])

创建等差数列,从 1 开始,5 结束,0.5 为差的等差数列,最后一项一定小于 5:

a = np.arange(1, 5, 0.5)
a

输出

array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])

创建单位矩阵(矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的 1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1。),参数可以指定大小:

a = np.eye(3)
a

输出

array([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])

生成指定长度,在 [0,1) 之间平均分布的随机数组:

np.random.random(5)

输出

array([0.39448889, 0.34565971, 0.88672892, 0.94258034, 0.05633518])

生成指定长度,符合正态分布的随机数组,指定其均值为 0,标准差为 0.1:

mu,sigma = 0, 0.1
np.random.normal(mu, sigma, 5)

输出

array([-0.02168114, 0.08116314, -0.10573889, -0.0143433 , -0.10197173])

0.6 NumPy 数组的访问

和 list 的访问形式基本一致,支持切片操作,我们可以切片每一个维度,索引每一个维度:

a = np.array([(1,2), (3,4), (5,6)])
a[0]

输出

array([1, 2])

a[1:]

输出

array([[3, 4],[5, 6]])

a[: , :1]

输出

array([[1],[3],[5]])

a[1][1]

输出

4

使用 take() 函数进行操作,take(indices[, axis, out, mode]) 提取指定索引位置的数据, 并以一维数组或者矩阵返回 (主要取决 axis):

a = np.array([1,2,3])
a.take(1)

输出

2

b = np.array([(1,2,3), (4,5,6)])
b.take(1, axis = 1)

输出

array([2, 5])

0.7 NumPy 数组的遍历

一维数组遍历

a = np.array([1,2,3])
for i in a:
	print(i)

输出

1

2

3

多维数组的遍历:

a = np.array([
              (1,2), 
              (3,4), 
              (5,6)])
for i,j in a:
	print(i*j)

输出

21230

0.8 NumPy 数组的常用属性

比较常用的属性有:

ndarray.ndim: 数组的维度(数组轴的个数),等于秩

ndarray.shape: 数组的大小。为一个表示数组在每个维度上大小的整数元组。例如二维数组中,表示数组的’’ 行数’’ 和’’ 列数”

ndarray.size: 数组元素的总个数,等于 shape 属性中元组元素的乘积

ndarray.dtype: 表示数组中元素类型的对象

ndarray.itemsize: 数组中每个元素的字节大小

ndarray.data: 包含实际数组元素的缓冲区,一般不用

img = plt.readimg('xxx.jpg')

# 100*100
# 颜色通道
# 宽度
# 高度
img  # [数量,宽,高,颜色] => [10,100,100,3]
a = np.array([(1,2,3), (4,5,6), (7,8,9)])
print("ndim:", a.ndim)
print("shape:", a.shape)
print("size", a.size)
print("dtype", a.dtype)
print("itemsize", a.itemsize)
print("data", a.data)

输出

ndim: 2shape: (3,3)size: 9dtype: dtype(’int32’)itemsize: 4data: <memory at 0x00000000058F8C18>

0.9 NumPy 数组的基本操作

  • in:检测数值是否在数组中

a = np.array([(1,2), (3,4)])
print(3 in a)
print(5 in a)

输出

TrueFalse


  • reshape: 数组的重排列,例如将一个 3 维数组转变为 1 维(元素数一定要保持不变)

a = np.zeros([2,3,4])
a

输出

array([[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]],[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]])

a.reshape(24)

输出

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0.])


  • insert: 插入元素,insert(arr, obj, values, axis) 其中参数

arr 是指数组,

obj 是指插入轴的对应下标,

values 是插入的值,

axis 指插入的轴是哪一个,axis = 0 插入行,axis = 1 插入列

a = np.array([(1,2,3), (4,5,6), (7,8,9)])
a = np.insert(a, 0, 0, axis = 0)
a

输出array([[0, 0, 0],[1, 2, 3],[4, 5, 6],[7, 8, 9]])


  • delete: 删除元素参数如下

arr:数组

obj:删除某一轴的对应标号

axis:axis=0 删除行,axis=1 删除列

np.delete(a, 0, axis = 1)

输出

array([[0, 0],[2, 3],[5, 6],[8, 9]])


  • copy:创建一个新的,内存分离的拷贝,赋值与 copy 的区别在于一个是浅拷贝,一个是深拷贝。

  • 赋值操作,两个变量指向同一个空间;

  • copy 操作,两个指向不同的空间

a = np.array([1,2,3])
b = a
b is a

输出

True

b = a.copy()
b is a

输出

False

a = np.array([1])
b

输出

array([1, 2, 3])


  • transpose:转置 (可以直接.T)

a = np.array([(1,2,3), (4,5,6), (7,8,9)])
a.transpose()

输出array([[1, 4, 7],[2, 5, 8],[3, 6, 9]])

a.T

输出array([[1, 4, 7],[2, 5, 8],[3, 6, 9]])


  • fill:用一个值填充数组

a = np.array([1,2,3])
a.fill(0)
a

输出

array([0, 0, 0])


  • flatten: 把多维数组转换为一维数组,注意每个元组的长度是相同的

a = np.array([(1,2), (3,4), (5,6)])
a.flatten()

输出

array([1, 2, 3, 4, 5, 6])


  • newaxis: 增加维度

a = np.array([1,2,3])
a.shape

输出

(3,)

a = a[ :, np.newaxis]
a

输出

array([[1],[2],[3]])

a.shape

输出

(3, 1)


  • tile:重复指定数组

a = np.array([(1,2), (3,4)])
np.tile(a, (2,3))

输出

array([[1, 2, 1, 2, 1, 2],[3, 4, 3, 4, 3, 4],[1, 2, 1, 2, 1, 2],[3, 4, 3, 4, 3, 4]])


0.10 NumPy 数组的数学操作

  • 加减乘除

* 星乘表示矩阵内各对应位置相乘,点乘表示求矩阵内积,二维数组称为矩阵积(mastrix product):

a = np.ones((2,2))
b = np.array([(-1,1),(-1,1)])
print(a)
print(b)

输出

array([[1., 1.],[1., 1.]])

array([[-1, 1],[-1, 1]])

a + b

输出

array([[0., 2.],[0., 2.]])

a - b

输出

array([[2., 0.],[2., 0.]])

a * b

输出

array([[-1., 1.],[-1., 1.]])

a / b

输出

array([[-1., 1.],[-1., 1.]])

a.dot(b)

输出

array([[-2., 2.],[-2., 2.]])

  • NumPy 中的常量

np.e

输出

2.718281828459045

np.pi

输出

3.141592653589793

np.Inf

输出

inf

np.NaN

输出

nan

  • sum: 求和,prod: 求积,数组的成员函数也可以用于 NumPy 的标准函数

a = np.array([1,2,1])
a.sum()

输出

4

a.prod()

输出

2

  • mean,var,std,max,min: 平均数,方差,标准差,最大值,最小值

a = np.array([5,3,1])
print("mean:",a.mean())
print("var:", a.var())
print("std:", a.std())
print("max:", a.max())
print("min:", a.min())

输出

mean: 3.0

var: 2.6666666666666665

std: 1.632993161855452

max: 5

min: 1

  • argmax,argmin: 最大与最小值对应的索引值; ceil, floor, rint: 取元素值上限,下限,四舍五入

a = np.array([1.2, 3.8, 4.9])
print("argmax:", a.argmax())
print("argmin:", a.argmin())
print("ceil:", np.ceil(a))
print("floor:", np.floor(a))
print("rint:", np.rint(a))

输出

argmax: 2argmin: 0ceil: array([2., 4., 5.])floor: array([1., 3., 4.])array([1., 4., 5.])

  • unique: 去除数组中重复的值,clip: 把数组里的元素限定到指定范围,并且超出范围的最大值与最小值变为对应的上下限

a = np.array([1,1,1,2,2,3,4,4,5,5,6,6,6])
print("unique:",np.unique(a))
print("clip:", a.clip(2,5))

输出

unique: array([1, 2, 3, 4, 5, 6])clip: array([2, 2, 2, 2, 2, 3, 4, 4, 5, 5, 5, 5, 5])

  • sort: 排序

a = np.array([16,31,12,28,22,31,48])
a.sort()
a

输出

array([12, 16, 22, 28, 31, 31, 48])

  • diagonal: 取对角元素

a = np.array([(1,2,3), (4,5,6), (7,8,9)])
a.diagonal()

输出

array([1, 5, 9])

除了上述函数外,还有很多数据运算操作,它们的使用方式基本都类似,例如:abs, sign, sqrt, log,log10, exp, sin, cos, tan, arcsin, arccos, arctan, sinh, cosh, tanh, arcsinh, arccosh,arctanh 等等。

0.11 NumPy 线性代数

有关线性代数的运算均在 numpy.linalg 中;

矩阵 (matrix) 是 array 的分支,matrix 和 array 在很多时候都是通用的,用哪一个都一样。官方建议大家如果两个可以通用,那就选择 array,因为 array 更灵活,速度更快。

array 的优势就是不仅仅表示二维,还能表示 3、4、5... 维,而且在大部分 Python 程序里,array 也是更常用的。

dot: 矩阵乘法,对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和 (数学上称之为内积);

对于二维数组,计算的是两个数组的矩阵乘积;

对于多维数组,它的通用计算公式如下,即结果数组中的每个元素都是:数组 a 的最后一维上的所有元素与数组 b 的倒数第二位上的所有元素的乘积和:dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

  • diag: 返回矩阵对角线元素,前文我们已经演示

a = np.array([(1,2,3), (4,5,6), (7,8,9)])
np.diag(a)

输出

array([1, 5, 9])

  • trace: 对角线元素和

a = np.array([(1,2,3), (4,5,6), (7,8,9)])
np.trace(a)

输出

15

  • det: 行列式,函数计算输入矩阵的行列式,行列式在线性代数中是非常有用的值,它从方阵的对角元素计算。

对于 2 X 2 矩阵,它是左上和右下元素的乘积与其他两个的乘积的差,换句话说,对于矩阵 [[a,b],[c,d]],行列式计算为 ad-bc。

a = np.array([(1,2), (3,4)])
np.linalg.det(a)

输出

2.0000000000000004

下面还有一些函数可以使用,这里不一一列出来作用,当我们碰到具体问题时,去查询相应的具体知识点就可以,这里我们只需大概了解有这么多函数可以使用。

eig: 特征值、特征向量

inv: 逆

qr:QR 分解

svd: 奇异值分解

solve: 解线性方程 Ax=b

lstsq: 计算Ax=b 的最小二乘解

0.12 NumPy 随机数

所有有关线性代数的运算均在 np.random 中

rand: 均匀分布的样本值

randint: 给定上下限的随机整数

randn: 标准正态分布

binomial: 二项分布

normal: 正态分布

chisquare: 卡方分布

gamma: Gamma 分布

uniform:[0,1] 之间的均匀分布

poisson: 泊松分布

shuffle: 洗牌

0.13 文件操作

二进制文件:np.save 、np.load

文本文件:np.loadtxt、np.savetxt

二进制文件会存储为.npy 的格式

0.14 NumPy 广播机制

广播 (Broadcast) 是 numpy 对不同形状 (shape) 的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

a = np.array([1,2,3])
b = np.array([4,5,6])
a + b

输出

array([5, 7, 9])

当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制

a = np.array([(1,2), (2,2), (3,3), (4,4)])
b = np.array([-1,1])
a + b

输出

array([[0, 3],[1, 3],[2, 4],[3, 5]])

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值