Numpy库基础方法汇总

Numpy库基础方法汇总

  • 矩阵基础
    • numpy主要数组对象ndarray
    • 数组的创建
      • 创建一个空数组:
      • 全0数组:
      • 全1数组
      • 随机矩阵
      • 更多其他矩阵生成方法
    • 获取矩阵的参数
      • 矩阵的维数
      • 矩阵的尺寸
      • 矩阵的元素个数
  • 矩阵操作
    • 获取某行/列/几行/几列
    • 添加/删除行列
    • 维度变换
    • 矩阵拼接
    • 判断矩阵是否包含某值
    • 矩阵数值类型转换
  • 矩阵运算
  • 随机数组
    • 生成随机数组
    • 随机打乱数组
  • 数组IO
  • numpy中的类型继承关系图
  • 参考文献

此文章汇总一些我在DL学习中用到过的np库方法,作为笔记留存,后续遇到其他新东西再添,欢迎一起探讨学习!

import numpy as np

矩阵基础

numpy主要数组对象ndarray

ndarray是numpy库的主要对象,如果你生成了一个矩阵,然后调用type()方法去查看它的类型的话,它就会返回ndarray对象:

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

数组的创建

理论上你可以用np.array()方法生成任意维数的数组,不过在实际操作中我们不可能用到太高维度的矩阵,我本人最高也就用到过5维矩阵。

创建一个空数组:

x = np.empty(shape = [2,5], dtype = int) 
print (x)
# [[2128575739 1309500030 1661424176 1988385690 1324770695]
#  [     12290          0          0          0          0]]

注: 值是随机的,因为没有初始化。
参数:

参数名 描述
shape 矩阵尺寸
dtype 元素数据类型
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。(很少用到)

全0数组:

x = np.zeros(shape = [2,5], dtype = int) 
print (x)
# [[0 0 0 0 0]
#  [0 0 0 0 0]]

全1数组

x = np.ones(shape = [2,5], dtype = int) 
print (x)
# [[1 1 1 1 1]
#  [1 1 1 1 1]]

随机矩阵

这里只列举一个简单的方法,后面会有更多其他关于随机矩阵的东西
[0,1) 之间,平均分布

x = np.random.rand(2,5) 
print (x)
# [[0.67571794 0.95051445 0.77698268 0.28708719 0.96148028]
#  [0.35231135 0.60493328 0.99423589 0.22146058 0.54518968]]

更多其他矩阵生成方法

方法名 含义
arange(n) 返回ndarray类型,元素从0到n-1
full(shape,value) 根据shape生成一个数组,每元素值全为value
eye(n) 一个正方形的n*n单位矩阵,对角线为1,其余为0
ones_like(a) 与a同尺寸的全1矩阵
zeros_like(a) 与a同尺寸的全0矩阵
full_like(a,value) 与a同尺寸的全value值矩阵
linspace(start,stop,num) 根据起止数据等间距地填充数据,形成数组

获取矩阵的参数

矩阵的参数有很多,只列举几个常见的,其余以后遇到再补

矩阵的维数

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

矩阵的尺寸

这里有好多种获取方法,最常用的一般是len()a.shape,前者只返回第1个维度的大小,后者返回一个数组,里面包括矩阵各个维度的大小

a = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print(len(a), len(a[0, :]))
# 2 5
print(a.shape)
# (2, 5)

矩阵的元素个数

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

矩阵操作

获取某行/列/几行/几列

我发现好像对于python的索引类型 M : N = [M, N),但是我没有找到确切的依据,如果有懂的大神敬请赐教。
如果是M : N : n,那就是在M和N之前按步长n取,这里不详细展开举例了

a = np.array([[1,2,3,4,5],
			  [6,7,8,9,10]])
print(a[0,:])  # 第1行 
# [1 2 3 4 5]
print(a[:,2])  # 第3列
# [3 8]
print(a[:,:2])  # 前2列
# [[1 2]
#  [6 7]]
print(a[:,1:4])  # 第2~4列 [2,4)
# [[2 3 4]
#  [7 8 9]]
print(a[:,-3:])  # 后3列
# [[ 3  4  5]
#  [ 8  9 10]]

M : N : n 表示在M和N之前按步长n取,这里不详细展开举例了
好像还可以自定义,没用过没见过没学过不懂先放这吧

添加/删除行列

# 删除一列
a = np.array([[1, 2, 3, 4, 5],
			  [6, 7, 8, 9, 10]])
a = np.delete(a, 0, axis=1)  
# 第一个参数是矩阵,第二个参数是要进行操作的行或列,第三个参数是维度,0代表行,1代表列,高维也可以
print(a)
# [[ 2  3  4  5]
#  [ 7  8  9 10]]

numpy添加行的操作比较多,这里只介绍几种操作简单的,主要就是np.append(a,b,axis=),还有np.row_stack((a, 行元素))np.column_stack((a, 列元素))

a = np.array([[1, 2, 3, 4, 5],
			  [6, 7, 8, 9, 10]])
a = np.append(a, [[0], [0]], axis=1)  
# a = np.coloumn_stack((a, [[0], [0]]))
print(a)
# [[1 2  3  4  5 0]
#  [6 7  8  9 10 0]]

如果np.append()不指定axis,则返回一个一维的数组

上述的只适用于二维,而如果是 KMN 的三维数组要往里添加一个二维 M*N 的矩阵怎么办呢?
二维先扩展为三维 ,然后用np.vstack() 扩展

x = x[np.newaxis, :]
y=np.vstack((y, x))  # 或者y=np.append(y,x,axis=0)

维度变换

N维变一维

a = np.array([[1, 2, 3, 4, 5],
			  [6, 7, 8, 9, 10]])
a=a.flatten()  # 返回一个数组的复制,这个函数就是专门将任意维的数组转换为1维的
a.shape=(-1)   # 返回一个数组的复制
a.reshape(-1)  # 同上

注意shape=[10]和shape=[1,10]不一样,前者是一维向量,后者是二维矩阵,np.reshape(-1)np.reshape(1,-1)分别会得到上述两种结果。还有一个np.resize()这个方法比较乱,不讨论了…什么简单用什么吧
其他维度的转换基本都是用np.reshape()实现的,具体方法大差不差,不再赘述,但是问题是这个reshape的数据结构是什么倒是个值得深入探讨的事情,欢迎大神赐教。

矩阵拼接

两个矩阵的拼接一般np.append()就可以搞定,具体参考上面的demo
两个以上的矩阵进行拼接一般使用np.concatenate((a1,a2,...), axis=)

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

判断矩阵是否包含某值

a.__contains__(0)  # 返回布尔值
0 in a  # 返回布尔
a == 0  # 返回一个和a同size的bool数组,每个元素代表a中同位置元素是否等于0,布尔量可以作为索引,具体例子看下图,懒得打了,判断两个矩阵是否相同也可以用这个方法

Numpy库基础方法汇总_第1张图片

矩阵数值类型转换

a = np.array([['1', '2', '3', '4', '5'],
			  ['6', '7', '8', '9', '10']])
a=a.astype(float)  # 此处写的是float 而不是np.float64, Numpy很聪明,会将python类型映射到等价的dtype上
# [[ 1.  2.  3.  4.  5.]
#  [ 6.  7.  8.  9. 10.]]
# 其他类型的互换参考https://blog.csdn.net/lingbomanbu628/article/details/88657528

矩阵运算

np.square()  # 元素平方
pow(a,n)  # 元素乘方,a^n
a**n  # 元素乘方,a^n
np.sqrt()  # 元素平方根
a.T  # 矩阵转置
a.transpose(1,0,2)  # 三维矩阵的第0个轴和第一个轴进行调换(转置),这个方法比较灵活,但是很容易弄错,如果不清楚高维numpy数组的数据结构的话
a.swapaxes(m,n)  # 将a矩阵的第m维和第n维进行调换(转置)
np.dot(a,b)  # 矩阵相乘(同线性代数),对于一维矩阵,计算两者的内积
np.multiply(a,b)  # 矩阵元素相乘
a*b  # 矩阵元素相乘

随机数组

生成随机数组

np.random.randint(low=0, high=9, size=40)  # 生成尺寸为size,元素介于[0,9)之间的随机整数值
np.random.permutation(10)  # 长度为10,从0到9乱序排列的数组
np.random.rand(2,5)  # 服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1
np.random.randn(2,5)  # 服从标准正态分布的随机样本值

随机打乱数组

a = np.array([64, 55, 26, 17, 8, 49, 120])
np.random.shuffle(a)  # 此方法直接在传入参数上修改,不返回变量,多维矩阵中,只对第一维(行)做打乱顺序操作
# a=np.random.permutation(a)  # 两个方法都可以,这个函数会返回一个打乱的复制,不会在原数组上修改
print(a)
# [  8 120  55  64  49  17  26]

数组IO

a = np.array([[1, 2, 3, 4, 5],
			  [6, 7, 8, 9, 10]])
b = np.array([64, 55, 26, 17, 8, 49, 120])
np.savez_compressed('D:\\demo.npz',A=a,B=b)  # A=a,A是保存的字典名,a是变量名
data=np.load('D:\\demo.npz')
a=data['A']
b=data['B']

numpy.load()返回的是一个类似于字典的变量,利用字典的用法就可以提取出里面的数组
np.savez_compressed()函数也可以只保存一个数组np.savez_compressed('D:\\demo.npz', a)

numpy中的类型继承关系图

Numpy库基础方法汇总_第2张图片

参考文献

numpy官方文档
NumPy 创建数组
Python开发:NumPy学习(一)ndarray数组
np.linspace() 函数
np.random.rand()函数
如何在python中找到numpy矩阵的长度(或尺寸,大小)?
numpy矩阵删除一列或一行
python将两个二维array叠加成三维array的实现方法
Numpy中二维数组变一维数组的函数与思考
numpy中三维数组转变成二维数组
python基础之numpy.reshape详解
numpy基础教程–将二维数组转换为一维数组
python小白之数组索引
numpy数组拼接方法介绍(concatenate)
numpy中的几种矩阵乘法
详解Numpy数组转置的三种方法T、transpose、swapaxes
Python numpy 平方、乘方和平方根函数
Python3 * 和 ** 运算符
检查Numpy数组中是否包含单个元素
numpy.array()如何判断一个值是否在其中?
numpy.random.shuffle打乱顺序函数
numpy 中的随机打乱数据方法np.random.shuffle
np.random.rand()函数
Numpy.random中shuffle与permutation的区别
[Python]Numpy数据类型转换的方法

你可能感兴趣的:(python,numpy,机器学习)