1 numpy
1.1 随机数
不放回取样:
从列表ori中不放回地取n个数
import random
sample_list = random.sample(ori, n)
通过这种操作,我们可以获得一个二维列表的子集:
(如果这个二维列表是图的邻接矩阵,那么就是对图进行随机采样,获得一个图的子图)
# array2d是一个二维列表
# sample_list是一个一维列表
# 可从array2d中取出sample_list为序号的行和列的交点,构成一个新的二维列表
print(array2d[sample_list , :][:, sample_list ])
1.2 numpy中数组的拼接和矩阵加减
首先要注意,"+" 操作对于list和numpy.array是完全不同的
python 中的list,"+"代表拼接:
import numpy as np
a = [
[1, 2],
[3, 4, 5],
[1]
]
b = [
[1, 2, 3],
[],
[1]
]
print(a+b)
# [[1, 2], [3, 4, 5], [1], [1, 2, 3], [], [1]]
在numpy.array中,"+"代表矩阵相加
a = [
[1, 2],
[3, 4,],
[1, 2]
]
b = [
[1, 2,],
[30, 40],
[10, 10]
]
a = np.array(a)
b = np.array(b)
print(a+b)
# [[ 2 4]
# [33 44]
# [11 12]]
2 pytorch
2.1 sum和max中常用的参数
2.1.1 keepdim
keepdim指的是维度不变,常在sum中使用。如:
import torch
a = torch.rand(2, 3)
a1 = torch.sum(a, dim=0)
a2 = torch.sum(a, dim=0, keepdim=True)
"""----------------
a: tensor([[0.7722, 0.8250, 0.9079],
[0.6037, 0.2440, 0.7660]])
a1: tensor([1.3759, 1.0690, 1.6739])
a2: tensor([[1.3759, 1.0690, 1.6739]])
-------------------"""
会发现,keepdim之后还是二维的
2.1.2 max()的返回值
这里要注意,pytorch和numpy里max()函数的返回值是不同的
pytorch:
import torch
a = torch.rand(2, 3)
b, c = a.max(1)
"""
a: tensor([[0.4581, 0.1494, 0.3477],
[0.9751, 0.5913, 0.2611]])
b: tensor([0.4581, 0.9751])
c: tensor([0, 0])
"""
也就是说,max(1)代表求第一维的最大值,对于二维数组来说,就是求纵向的最大值,然后,第一个返回值是最大值所形成数组,第二个返回值是最大值所在的索引。这一个技巧在机器学习的分类任务中很常用,比如我们的分类任务是把数据分成m类,那么最终我们模型的输出是m维的,对于n个样本就是n*m,如果要判断我们的模型最终的分类结果,就是找n个样本里,每个样本m维输出的最大值索引,代表样本是这个类的可能性最大。我们可以方便地用这种方式找到最大值地索引:
predict_y = test_out.max(1)[1] # 对每一行取最大值,并求最大值所在的索引
其中test_out是模型输出,predict_y则是分类结果
另外一点要注意的是,numpy与pytorch不同,numpy的max()只有一个返回值:
import numpy as np
a = np.random.randn(2, 3)
b = a.max(1)
"""
a: [[ 0.51342459 0.53199391 0.00660358]
[-0.01104745 -0.16093255 0.77229019]]
b: [0.53199391 0.77229019]
"""
也就是说,numpy.max()不会返回最大值所在的索引