学习笔记来源于NumPy官网:NumPy documentation — NumPy v1.25 Manual
可能涉及使用jupyter的内容,即变量可以直接打印,可能会和pycharm存在差异
目录
1. 导入
import numpy as np
import torch
2. 关于数组的函数或类
2.1. 绘图函数的矩阵/数组输入类型
(1)numpy.matrix:矩阵
①numpy.matrix的参数
class numpy.matrix(data, dtype=None, copy=True)
②⭐官网Note:不再建议使用此类,即使对于线性代数也是如此。而是使用常规数组。该类可能会在未来被删除。
③numpy.matrix的返回:从类似数组的对象或数据字符串返回矩阵。 矩阵是保留其 2-D 性质的专用 2-D 数组 通过操作。它具有某些特殊的运算符,例如(矩阵乘法)和(矩阵幂)。
④示例
(2)numpy.asarray:将输入转换为数组
①numpy.asarray的参数
numpy.asarray(a, dtype=None, order=None, *, like=None)
②numpy.asarray的返回值:数组解释 a.如果输入,则不执行复制 已经是一个具有匹配 dtype 和顺序的 ndarray。如果 a 是 NDarray的子类,返回一个基类NDARRAY。
③示例(事实证明和上面那个看上去一样,只是应该格式不一样)
2.2. 数组的创建和添加
(1)np.array()
①一维数组
a = np.array([1, 2, 3, 4, 5, 6])
②二维数组
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
③高的就不一一例举了
(2)np.zeros() 或 np.ones():创建括号中大小的为全0或全1的数组
(3)np.empty():创建一个为括号内数大小的全部数为随机数(取决于内存)的数组
(4)np.arange():其中数字可以分别为第一个数,最后一个数,步长,从而建立数组
(5)np.linspace():第一个参数是开始数,第二个是结束值,num是生成多少个数(所以和刚刚的arange会有差异,相当于linspace的步进是机器算的)
①参数
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
②返回值
(6)指定数据类型(就是在后面加dtype)
①代码示例
x = np.ones(2, dtype=np.int64)
(7)np.newaxis:添加新轴
①代码示例
a = np.array([1, 2, 3, 4, 5, 6])
a2 = a[np.newaxis, :]
a3 = a[:, np.newaxis]
a.shape,a2.shape,a3.shape
②结果展示
(6,),(1, 6),(6, 1)
(8)np.expand_dims():在指定位置插入新轴来扩展阵列
①代码示例
a4 = np.expand_dims(a, axis=1)
a5 = np.expand_dims(a, axis=0)
a4.shape,a5.shape
②结果展示
(6, 1),(1, 6)
2.3. 数组的合并和排序
(1)np.sort():排序(好像默认升序)
①参数
numpy.sort(a, axis=-1, kind=None, order=None)
②参数axis:默认-1,如果没有的话这个数组会在排序前被展平
③参数kind:默认为快排,但是还有其他的可以选,如 'mergesort', 'heapsort', 'stable'
④参数order:可选str或list of str,区别是按字符串还是字段
(2)np.ndarray.sort():就地排序
①参数
ndarray.sort(axis=-1, kind=None, order=None)
(3)np.concatenate():把两个数组连起来,但是需要注意的是写出来有俩括号
①参数
numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
2.4. 数组的形状和大小
(1)数组名.ndim:显示出数组的轴数或尺寸(因为是方法所以是".")
(2)数组名.size:显示出数组元素中的总数
(3)数组名.shape:显示出数组的形状
(4)数组名.reshape:更改形状,但是要保证元素总个数一样,其中也有个order参数可以控制按指定的索引顺序读/写元素
2.5. 数组的堆叠
(1)这个stack和torch.cat((x,y),dim= )应该是一样的道理
(2)np.vstack():垂直堆叠
①代码示例
a1 = np.array([[1, 1],
[2, 2]])
a2 = np.array([[3, 3],
[4, 4]])
np.vstack((a1, a2))
②结果展示
(3)np.hstack():水平堆叠
①代码示例
np.hstack((a1, a2))
②结果展示
(4)np.hsplit:数组拆分(偷个懒)
(5)zip():将单个列表打包成更多维的列表
①元素不可以!如n1 = 0和n2 = [1, 2]是不可以一起打包的!
②测试总样本代码
c = [0]
x = [1, 2]
y = [3, 4, 5]
z = [6, 7, 8, 9]
h = [[1,2,3,4],[5,6,7,8]]
n1 = zip(c,x) #测试不同大小的列表的压缩,但不用list表示
n2 = list(zip(c,x)) #将不同大小的列表压缩并用list表示
n3 = list(zip(y,z)) #ditto
n4 = list(zip(z,h)) #将不同维度的列表压缩
n5 = list(zip(x)) #单个压缩
n6 = list(zip()) #空压缩
n7 = list(zip(*n3)) #猜测是解压缩,答案需要看输出
③测试结果展示
2.6. 数组的快捷操作
(1)数组名.max, 数组名.min, 数组名.sum:快捷求最大,最小,和
(2)List类型测试
①代码
x = [1, 2, 3, 4]
②结果展示
光荣地失败了!说明max不能对列表用
(3)一维np.array测试
①代码
y = np.array([1, 2, 3, 4 ])
②结果展示
还活着!取了个最大值,看上去蛮正常的
(4)多维np.array测试(这时候会给单个数据max还是以一个列表作为元素呢?)
①代码
z = np.array([1,2,3,4,5,6]).reshape(1,2,3)
"""或"""
z = np.array([[[1,2,3],[4,5,6]]])
②结果展示
首先能很清楚地看到z确实成了三维的,然后z.max()从中截取的是元素
(5)torch.tensor测试
①代码(直冲二维)
h = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [8, 3, 2, 1]])
②结果展示
看上去还是返回的单个元素!但是是tensor类型的
2.7. 数组的反转
(1)np.flip():这个和转置有点不一样,感觉是前后颠倒
①代码
a = np.array([1,2,3,4]) #一维
b = np.array([[1,2],[3,4]]) #二维
c = np.array([[[1,2],[3,4]]]) #三维
np.flip(a),np.flip(b),np.flip(c)
②结果展示
(2)np.transpose():维度/轴变换
①举个栗子,比如我现在手里有个(图片来源:numpy之transpose详解_numpy transpose_代码拖拉鸡的博客-CSDN博客)
②按理来说,np.transpose(0,1,2)表示不变(里面的就表示维度在正常位置)
③但是如果改变里面的参数,如np.transpose(0,2,1),意思就是交换第一维和第二维,把数组维度变成(2,4,2),其余变换同理
3. 随机数
3.1. 计算机中的随机数
(1)用计算机的算法生成的实际上都叫伪随机数(Pseudo-random Number),它和自然的随机数有差别,但是十分近似和方便所以平时我们都用伪随机来代替真随机
3.2. NumPy生成随机数
(1)np.random.default_rng():是个随机数生成器
①随机数生成器代码
rng = np.random.default_rng()
②普通随机
③标准正态随机
④集合内随机
(2)secrets:随机数种子
①代码和结果
可以看出secrets.randbits()会每次生成随机的128位数,可以避免大家的随机数种子用到同样的。因此把这个大数嵌在rng里面会更有随机保证。
4. 唯一数
4.1. 获取唯一数
(1)np.unique():找到数组中所有的值(如5,5,5有三个就变成一个5)(后面那个index参数可加可不加,加了的话返回的是第一个看到的新数的下标。counts就是分别返回每个数有多少个)
①代码
a = np.array([1,2,3,4,5,5,6,6,6])
b,c,d = np.unique(a,return_index=True,return_counts=True)
b,c,d
②结果展示
也适用于二维数组,同时在二维数组中还是以单个数字为元素。若要以行列为单个元素,则需要指出axis=n