ndarray
NumPy中最重要的类是ndarray
,顾名思义,即多维数组。
import numpy as np
行向量:
a = np.array([1,2,3]) # a.shape=(3L,)
列向量:
b = np.array([[1],[2],[3]]) # b.shape=(3L, 1L)
二维矩阵:
M = np.array([[1,2,3],[4,5,6],[7,8,9]] # M.shape=(3L, 3L)
四则运算(+-*/),注意多维数组ndarray中“加减乘除”跟数学中的矩阵运算没有半毛钱关系。
运算都是Element-wise的,当两个数组维度不一样时,维度小的会拓展复制(Broadcast)跟维度大的数组一样。
例如上面的行向量a
和列向量b
分别与M
进行四则运算时,会拓展为:
例子:
a + M
:
b + M
:
b - M
:
b * M
:
b / M
:
当a
是4维的行向量与M
运算呢?
例如a = [1, 2, 3, 4]
,a + M
等于多少呢? 此时会报错:
ValueError: operands could not be broadcast together with shapes (4,) (3,3)
matrix
那NumPy中难道就没有像数学中的矩阵乘法运算了吗?答案是有的,这里就要用到matrix
类,其有一个别名mat
,用法是一样的。
行向量:
p = np.mat([1,2,3]) # p.shape=(1L, 3L)
列向量:
q = np.mat([[1],[2],[3]]) # q.shape=(3L, 1L)
二维矩阵:
N = np.mat([[1,2,3],[4,5,6],[7,8,9]]) # N.shape=(3L, 3L)
它们之间的加减除跟ndarray是一样的,但乘就按照数学矩阵乘法:
p * N
:
q * N
则会报错:
ValueError: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)
对于matrix,数据均以二维的形式存储,例如:
p
:
matrix([[1, 2, 3]])
q
:
matrix([[1],
[2],
[3]])
p * q
(结果是一个标量):
matrix([[14]])
np.dot()和np.multiply()
ndarray数组可以实现矩阵的乘法,即:
np.dot(a, b) # array([14])
np.dot(a, M) # array([30, 36, 42])
np.dot(a, a) # 14;特别地,两个行向量得到数学中的内积
np.dot(b, b) # 报错!
matrix可以实现Element-wise的点乘,即:
np.multiply(p, N)
Out:
matrix([[ 1, 4, 9],
[ 4, 10, 18],
[ 7, 16, 27]])
注意区分数学中的点乘和计算机中的点乘:数学中的点乘也叫点积、内积,是两个向量中的元素分别相乘再相加得到一个标量;而计算机中的点乘就是指Element-wise的乘法。
ndarray和matrix之间相互转换
np.asarray(matrix)
np.asmatrix(ndarray)
注意如果ndarray是3维及以上的数组,则转不了matrix,因为matrix总是二维的。
如:
t = np.arange(12).reshape(2, 2, 3)
Out:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
np.asmatrix(t)
# ValueError: shape too large to be a matrix.