李沐 《动手学深度学习》学习笔记 (3)第一章 预备知识 第一节 数据操作

第一节数据操作

from mxnet import np, npx
npx.set_np() #设置兼容MXNet 其他的张量处理组件

1.1.1创建指定元素和规模的矩阵

(1) np.arrange, np.reshape

#numpy.arange创建一个行向量,包含从0开始到12的整数,默认为浮点数
x = np.arange(12)
x
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11.])
x.shape
(12,)
x.size
12
#改变⼀个张量的形状而不改变元素数量和元素值,我们可以调⽤reshape 函数
X = x.reshape(3,4)
X
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]])

(2) np.zeros, np.ones 创建全0或者全1矩阵

#创建全0或者全1的矩阵
np.zeros((2,3,4))
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.]]])
np.ones((2,3,4))
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])
### np.random.normal 从正态分布中随机取样
np.random.normal(0, 1, size=(3, 4))
array([[ 1.1630785 ,  2.2122061 ,  0.4838046 ,  0.7740038 ],
       [ 0.29956347,  1.0434403 ,  0.15302546,  1.1839255 ],
       [-1.1688148 ,  1.8917114 ,  1.558071  , -1.2347414 ]])

(3) np.array 创建指定元素的矩阵

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

1.1.2 数据运算

(1) 按元素运算

x = np.array([1, 2, 4, 8])
y = np.array([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x**y # **运算符是求幂运算
(array([ 3.,  4.,  6., 10.]),
 array([-1.,  0.,  2.,  6.]),
 array([ 2.,  4.,  8., 16.]),
 array([0.5, 1. , 2. , 4. ]),
 array([ 1.,  4., 16., 64.]))
np.exp(x)
array([2.7182817e+00, 7.3890562e+00, 5.4598148e+01, 2.9809580e+03])
x == y
array([False,  True, False, False])

(2) 张量连接

X = np.arange(12).reshape(3, 4)
Y = np.array([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
np.concatenate([X, Y], axis=0), np.concatenate([X, Y], axis=1)
(array([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [ 2.,  1.,  4.,  3.],
        [ 1.,  2.,  3.,  4.],
        [ 4.,  3.,  2.,  1.]]),
 array([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
        [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
        [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))

1.1.3 广播机制

#在⼤多数情况下,我们将沿着数组中⻓度为1的轴进⾏⼴播
a = np.arange(3).reshape(3, 1)
b = np.arange(2).reshape(1, 2)
a, b
(array([[0.],
        [1.],
        [2.]]),
 array([[0., 1.]]))
a + b
array([[0., 1.],
       [1., 2.],
       [2., 3.]])
#a = np.arange(10).reshape(5, 2)
#b = np.arange(9).reshape(3, 3)
#a, b, a + b 这样相加是会报规模不匹配的错误

1.1.4 索引和切片

X[-1], X[1:3]
(array([ 8.,  9., 10., 11.]),
 array([[ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]]))
X[1, 2] = 9
X
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  9.,  7.],
       [ 8.,  9., 10., 11.]])
X[0:3:2, :]
array([[ 0.,  1.,  2.,  3.],
       [ 8.,  9., 10., 11.]])

1.1.5 节省内存

Z = np.zeros_like(Y)
Z[:] = X + Y
Z
array([[ 2.,  2.,  6.,  6.],
       [ 5.,  7., 12., 11.],
       [12., 12., 12., 12.]])

1.1.6 转换为其他Python对象

A = X.asnumpy()
B = np.array(A)
type(A), type(B)
(numpy.ndarray, mxnet.numpy.ndarray)
#大小为1的张量转换成Python标量
a = np.array([3.5])
a, a.item(), float(a), int(a)
(array([3.5]), 3.5, 3.5, 3)

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