下列内容主要参考自《Python深度学习——基于Pytorch》(机械工业出版社),会随着学习加深持续更新。
import numpy as np
# 1.1 生成Numpy数组
# 1.1.1 从已有数据中创建数组
# 将列表转换成ndarray
lst1 = [[3.14, 2.17, 4], [0, 1, 2]]
nd1 = np.array(lst1)
print(nd1)
print(type(nd1))
print(nd1.shape) # (2,3)
print(nd1.size) # 6
# 1.1.2 利用random模块生成数组
# 设置浮点数种子
np.random.seed(4)
# 生成0-1的随机数
print(np.random.random(2)) # 得到的是一维数组
print(np.random.random((2, 3))) # 得到的是2x3的数组
print(np.random.rand(2)) # 得到的是一维数组
print(np.random.rand(2, 3)) # 得到的是2x3的数组
# 生成均匀分布的随机数
print(np.random.uniform(2, 8, 2)) # 得到的是[2,8)的一维数组
print(np.random.uniform(2, 8, (3, 4))) # 得到的是3x4的数组
# 生成标准正态分布的随机数
print(np.random.randn(3)) # 得到标准正态分布的一维数组
print(np.random.randn(3, 3)) # 得到3x3的标准正态分布的二维数组
# 随机打乱顺序
lst2 = [3.14, 2.17, 4, 0, 1, 2]
x = np.array(lst2)
np.random.shuffle(x) # 对原ndarray进行打乱,本身没有返回值
print(x)
# 生成随机的浮点数
print(np.random.sample()) # 随机生成一个0-1的浮点数
# 1.1.3 创建特定形状的多维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print(np.zeros((3, 4))) # 创建3x4的元素全为0的数组
print(np.ones((3, 4))) # 创建3x4的元素全为1的数组
print(np.empty((3, 4))) # 创建3x4的元素为垃圾值的数组
print(np.zeros_like(a))
print(np.ones_like(a))
print(np.empty_like(a))
print(np.eye(5)) # 5x5的对角线为1的方阵
print(np.full((3, 5), 666)) # 创建3x5的元素为666的数组
print(np.diag([1, 2, 3])) # 三阶的对角矩阵
# 1.1.4 利用arange、linspace函数生成数组
print(np.arange(10))
print(np.arange(0, 10))
print(np.arange(1, 4, 0.5))
print(np.arange(9, 0, -1))
print(np.linspace(0, 1, 10))
# 1.2 获取元素
# 一维
nd1 = np.random.random(10)
print(nd1)
print(nd1[3])
print(nd1[3: 6])
print(nd1[1: 6: 2])
print(nd1[: : -2])
# 二维
nd2 = np.arange(25).reshape([5, 5])
print(nd2)
print(nd2[1:3, 1:3])
print(nd2[(nd2 > 3) & (nd2 < 10)])
print(nd2[[1, 2]])
print(nd2[1: 3, :])
print(nd2[:, 1: 3])
# random.choice
a = np.arange(25)
print(np.random.choice(a, size=(3, 5)))
print(np.random.choice(a, size=(3, 5), replace=False))
print(np.random.choice(a, size=(3, 4), p=a/np.sum(a)))
# 1.3 Numpy的算术运算
# 1.3.1元素相乘
X = np.array([[1, 2], [-1, 4]])
Y = np.array([[2, 0], [3, 4]])
print(X*Y)
print(np.multiply(X, Y))
# 数组与标量相乘,或通过广播机制和数组中的每一个元素相乘
# 一些常用的操作可以通过广播机制实现
X = np.random.rand(2, 3)
print(X)
def relu(X):
return np.maximum(0, X)
def softmax(X):
return np.exp(X)/np.sum(np.exp(X))
# 1.3.2 点积运算
X1 = np.array([[1, 2, 3], [5, 6, 7]])
X2 = np.array([[1, 2], [3, 4], [5, 6]])
print(np.dot(X1, X2))
# 1.4 数组变形
# 1.4.1 更改数组形状
# reshape:在使用时暂时改变向量的维度,不改变向量本身
arr1 = np.arange(10)
print(arr1)
temp = arr1.reshape(2, 5)
print(temp)
temp[0] = -1 # 可以看到,如果对temp做一些操作,arr中的元素也是会跟着变化的
print(arr1) # arr是没有变换的
print(arr1.reshape(5, -1)) # 指定维度时可以只指定行数或列数,其他用-1代替
print(arr1.reshape(-1, 5))
# resize: 改变向量的维度(修改了向量本身)
arr2 = np.arange(10)
print(arr2)
arr2.resize(2, 5)
print(arr2)
# T: 向量转置
arr3 = np.arange(12).reshape(3, 4)
print(arr3)
temp = arr3.T
print(temp)
temp[0][0] = -1
print(temp)
print(arr3) # 转置矩阵中的值变化,原矩阵中的值也会变化
# ravel: 向量展平
arr4 = np.arange(12).reshape(2, -1)
temp1 = arr4.ravel()
temp2 = arr4.ravel('F') # 列优先
print(temp1)
print(temp2)
temp1[0] = -1
print(arr4)
# flatten: 把矩阵转换为向量
arr5 = np.floor(10*np.random.random((3, 4)))
print(arr5)
print(arr5.flatten())
# squeeze: 用于降维,如果某个维度只有一项,这个维度会被去掉
arr6 = np.arange(6).reshape(3,1,2,1)
print(arr6)
print(arr6.shape)
temp = arr6.squeeze()
print(temp)
print(temp.shape)
temp[0][0] = -1
print(arr6)
# transpose: 对高维矩阵进行轴对换
arr7 = np.arange(24).reshape(2, 3, 4)
print(arr7)
print(arr7.shape)
temp = arr7.transpose(1, 2, 0)
print(temp)
print(temp.shape)
# 1.4.2 合并数组
# append & concatenate
# 对于一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.append(a, b)
print(c)
# 对于二维数组
a = np.arange(4).reshape(2, 2)
b = np.arange(4).reshape(2, 2)
c = np.append(a, b, axis=0)
print(c)
d = np.append(a, b, axis=1)
print(d)
# concatenate和append使用方法一致,但内存占用更小
# 沿着哪个维度合并,恰恰不要求要拼接的两部分在这个维度上尺度一致,而除了这个维度之外的维度尺度必须一致