数据类型不同
np.array产生numpy.ndarray类型的数据,不能进行矩阵意义上的乘法。np.matrix,np.mat产生numpy.matrix类型数据,可以进行矩阵相乘
见下例
import numpy as np
a = np.mat('1 2 3;3 4 5;1 2 3')
b = np.mat([[1, 2], [3, 4]])
print(a)
print(b)
'''
两种方法都可以
[[1 2 3]
[3 4 5]
[1 2 3]]
[[1 2]
[3 4]]
'''
print(type(a))
print(type(b))
'''
<class 'numpy.matrix'>
<class 'numpy.matrix'>
'''
c = np.array([[1, 2], [3, 4]])
print(c)
'''
[[1 2]
[3 4]]
'''
print(type(c)) #<class 'numpy.ndarray'>
解释:array是创建数组,他的shape是(6,),但使用reshape后 可以将数组转换为矩阵。(见下例)
np.array与np.arange的区别:np.array必须自己手动输入数组;np.arange与直接使用range类似,可以产生一串数字。但二者产生的都是数组并非矩阵。
a = np.arange(12).reshape(3,4)
print(a)
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
'''
b = np.array([1,2,3,4,5,6])
print(b.shape) #(6,)
c = b.reshape(2,3)
print(c.shape) #(2, 3)
一维数组和一维矩阵的区别
(12,)表示是数组,只有一个[ ] ; (1, 12)是一维矩阵,左右各有两个[ ] ,matrix可以使二维数组变为二维矩阵,可以将数组变为一维矩阵
a = np.arange(12)
print(a.shape) #(12,)
#[ 0 1 2 3 4 5 6 7 8 9 10 11]
a = np.matrix(a)
print(a.shape) #(1, 12)
#[[ 0 1 2 3 4 5 6 7 8 9 10 11]]
c = np.matrix([[1,2,3,4,5,6],[7,8,9,10,11,12]], dtype=int)
print(c)
'''
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
'''
由数组变为矩阵有np.mat和np.matrix两种方法。
使用np.mat后,如果对原数组进行改变,矩阵也会相应发生变化,如下:
#创建ndarray二维数组
x = np.array([[1, 2], [3, 4]])
#生成 <class 'numpy.matrix'> 矩阵
m = np.mat(x)
#打印 m 矩阵
print(m)
'''
[[1 2]
[3 4]]
'''
x[0,0] = 0
print(m)
'''
[[0 2]
[3 4]]
'''
但使用np.matrix后,如果对原数组进行改变,矩阵不会相应发生变化,如下:
#创建ndarray二维数组
x = np.array([[1, 2], [3, 4]])
#生成 <class 'numpy.matrix'> 矩阵
m = np.matrix(x)
#打印 m 矩阵
print(m)
'''
[[1 2]
[3 4]]
'''
x[0,0] = 0
print(m)
'''
[[1 2]
[3 4]]
'''
注意:不同类型的数据在使用他们三者时的效果不同。
使用np.dot才能进行矩阵的相乘(2×3与3×2=2×2 相乘后相加),但乘积的结果类型为<class ‘numpy.ndarray’> 说明它不是真正的矩阵相乘,但是可以遵守矩阵相乘的法则。
import numpy as np
a = np.array([[1,2,3],[1,1,1]])
b = np.array([[1,1],[1,1],[1,1]])
print(a)
'''
[[1 2 3]
[1 1 1]]
'''
print(b)
'''
[[1 1]
[1 1]
[1 1]]
'''
print(np.dot(a,b))
'''
[[6 6]
[3 3]]
'''
如果不符合矩阵乘法规则,则必须两数组的形式完全相同,才能进行运算。
a*b就是对应元素的乘积,multiply也是对应元素的乘积,乘积的结果类型为<class ‘numpy.ndarray’>
a = np.array([[1,2,3],[1,1,1]])
b = np.array([[1,1,1],[1,1,1]])
print(a)
'''
[[1 2 3]
[1 1 1]]
'''
print(b)
'''
[[1 1 1]
[1 1 1]]
'''
print(a*b)
'''
[[1 2 3]
[1 1 1]]
'''
默认 a*b与 dot(a,b)是矩阵的乘积(3×3与3×1=3×1即m×n与n×y=m×y),结果类型为<class ‘numpy.matrix’>
import numpy as np
a = np.mat('1 2 3;3 4 5;1 2 3')
b = np.mat([[1],[1],[1]])
c = np.dot(a,b)
print(c)
'''
[[ 6]
[12]
[ 6]]
'''
c = a*b
print(c)
'''
[[ 6]
[12]
[ 6]]
'''
multiply转化为对应元素的乘积,相乘条件为两矩阵均为完全相同的格式 或 行数相同且列数为1(2×3与2×1=3×3即m×n与m×1=m×n),对应位置只相乘不进行相加
import numpy as np
a = np.matrix('1 2 3;3 4 5') #相同格式
b = np.matrix([[1,1,1],[2,2,2]])
c = np.multiply(a,b)
print(c)
'''
[[ 1 2 3]
[ 6 8 10]]
'''
a = np.matrix('1 2 3;3 4 5') #行数相同其中一个列数为1
b = np.matrix([[1],[2]])
c = np.multiply(a,b)
print(c)
'''
[[ 1 2 3]
[ 6 8 10]]
'''
np.dot无论数据是array或matrix都表示矩阵相乘
np.multiply无论数据是array或matrix都表示对应位置相乘
如果数据类型为array,(*)和np.multiply表示对应位置相乘,np.dot表示矩阵形式相乘
如果数据类型为matrix,np.multiply表示对应位置位置相乘,(*)和np.dot表示矩阵形式相乘