1、初始化矩阵的时候,如果矩阵为复数,则需要
np.zeros((N,M,L),dtype=complex) 指明矩阵类型,否则赋值的时候会提示ComplexWarning: Casting complex values to real discards the imaginary part
2、矩阵赋值的时候,numpy默认为行向量赋值,这是跟matlab很不一样的一点
例如:
X = np.zeros((N,M),dtype=complex)
a = np.ones((N,1))
这时如果写X[:,1] = a,则会报错ValueError: could not broadcast input array from shape (N,1) into shape (N)
相反,如果你对a转置,变成行向量,再赋值则没有问题
3、要习惯numpy矩阵索引是从0:N-1的
4、行向量、列向量的关系
a = np.array([1,2,3]) a.shape 输出 (3,)
b = np.array([[1,2,3]]) b.shape 输出 (1,3)
c = np.ones((1,3)) c.shape 输出 (1,3)
d = np.array([[2],[5],[8]]) d.shape 输出 (3,1)
a+c 输出array([[2., 3., 4.]]) shape (1,3)
b+c 输出array([[2., 3., 4.]]) shape (1,3)
d+c 输出array([[3., 3., 3.], shape (3,3)
[6., 6., 6.],
[9., 9., 9.]])
a+d 输出array([[ 3, 4, 5], shape (3,3)
=b+d [ 6, 7, 8],
[ 9, 10, 11]])
a+b 输出array([[2, 4, 6]]) shape(1,3)
结论:
1) a这种size为(3,)的向量其实可以当做行向量来处理,与行向量c相加为行向量,与列向量d相加为矩阵
2) 还有一种情况会出现向量的size是一个数的,就是从矩阵里取一列或一行,此时不管是取列还是行,size都是(m,),也就是说都是行向量的形式。此后再利用这个列或者行去做运算,如果结果为向量,那么这个向量的size都是(m,)这种形式的。
例如:e.shape 是(3,3) 则e[:,2].shape 和 e[1,:].shape 都是(3,)
但是矛盾的是,此时,假设有g = e[1,:] shape为(3,) 如果把g当做行向量的话,把e和g做矩阵乘法,按照线性代数想法是不能运算的,但是却可以运算
e.dot(g)
Out[133]: array([ 86, 149, 212])
e.dot(g).shape
Out[134]: (3,)
且shape 为(3,)