numpy——np.array、np.matrix、np.mat的区别及(*)、np.multiply、np.dot乘法的区别

【1】np.array,np.matrix,np.mat的区别

(1)np.array和后两者的区别

数据类型不同
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]]
 '''

(2)np.mat和np.matrix的区别

由数组变为矩阵有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]]
'''

【3】矩阵相乘 (*)、np.multiply、np.dot的区别

注意:不同类型的数据在使用他们三者时的效果不同。

(1)当被乘的二者为array时

使用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]]
'''

(2)当被乘的二者为mat/matrix时

默认 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]]
'''

(3)总结

np.dot无论数据是array或matrix都表示矩阵相乘
np.multiply无论数据是array或matrix都表示对应位置相乘

如果数据类型为array,(*)和np.multiply表示对应位置相乘,np.dot表示矩阵形式相乘

如果数据类型为matrix,np.multiply表示对应位置位置相乘,(*)和np.dot表示矩阵形式相乘

猜你喜欢

转载自blog.csdn.net/qq_46126258/article/details/107705262