掌握了Numpy多维数组的运算,才可以高效地实现神经网络。
1.多维数组:
- Numpy生成一维数组:
import numpy as np
a = np.array([1,2,3,4])
print(a)
print(np.ndim(a))
print(a.shape)
print(a.shape[0])
输出结果为:
array([1, 2, 3, 4])
1
(4,)
4
数组的维度可以通过np.ndim()
方法获得。
数组的形状可以通过np.shape
方法获得,返回一个元祖(tuple)。
- Numpy生成二维数组:
b = np.array([[1,2],[3,4],[5,6]])
print(b)
print(np.ndim(b))
print(b.shape)
输出结果为:
array([[1, 2],
[3, 4],
[5, 6]])
2
(3, 2)
二维数组也称作矩阵(matrix)
。
其中数组的横向排列叫做行(row)
,纵向排列叫做列(column)
。
2.矩阵乘法:
矩阵的乘法是通过左边矩阵的行(横向)和右边矩阵的列(纵向)以对应元素的方式相乘后再求和得到的,运算得到的结果为一个新的多维数据。
在Python中实现方式为:
a = np.array([[1,2],[3,4]])
print(a)
b = np.array([[5,6],[7,8]])
print(b)
print(np.dot(a,b))
print(np.dot(b,a))
输出结果为:
array([[1, 2],
[3, 4]])
array([[5, 6],
[7, 8]])
array([[19, 22],
[43, 50]])
array([[23, 34],
[31, 46]])
这里需要注意的是np.dot(a,b)
和np.dot(b,a)
的结果可能不一样。
在看一下其他数组的运算结果。
2*3
的矩阵a和3*2
的矩阵b的乘积:
a = np.array([[1,2,3],[4,5,6]])
print(a)
print(a.shape)
b = np.array([[1,2],[3,4],[5,6]])
print(b)
print(b.shape)
输出结果为:
array([[1, 2, 3],
[4, 5, 6]])
(2, 3)
array([[1, 2],
[3, 4],
[5, 6]])
(3, 2)
array([[22, 28],
[49, 64]])
2*3
的矩阵a和2*2
的矩阵b的乘积:
a = np.array([[1,2,3],[4,5,6]])
print(a)
print(a.shape)
b = np.array([[1,2],[3,4]])
print(b)
print(b.shape)
print(np.dot(a,b))
输出结果为:
array([[1, 2, 3],
[4, 5, 6]])
(2, 3)
array([[1, 2],
[3, 4]])
(2, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shapes (2,3) and (2,2) not aligned: 3 (dim 1) != 2 (dim 0)
可以发现这时会报错,提示维度不一致,即a矩阵第1维和b矩阵第2维的元素个数不一致。
因此在矩阵乘积运算中,对应维度的元素个数只有保持一致才能进行运算。