它们各自的优点和缺点是什么?
据我所知,如果需要的话,任何一种都可以作为另一种的替代品,所以我是应该同时使用两种呢,还是应该坚持使用其中一种呢?
程序的风格会影响我的选择吗?我正在使用numpy做一些机器学习,所以确实有很多矩阵,但也有很多向量(数组)。
a*b
import numpy as np a = np.mat('4 3; 2 1') b = np.mat('1 2; 3 4') print(a) # [[4 3] # [2 1]] print(b) # [[1 2] # [3 4]] print(a*b) # [[13 20] # [ 5 8]]
另一方面,从Python 3.5开始,NumPy支持使用@操作符进行中子星矩阵乘法,因此你可以在Python >= 3.5中使用ndarray实现同样方便的矩阵乘法。
@
import numpy as np a = np.array([[4, 3], [2, 1]]) b = np.array([[1, 2], [3, 4]]) print(a@b) # [[13 20] # [ 5 8]]
.T
.H
.I
相反,numpy数组始终遵守操作规则 按元素应用(除了新的@操作符)。因此,如果a和b是numpy数组,则a*b就是数组 由元素相乘组成:
a
b
c = np.array([[4, 3], [2, 1]]) d = np.array([[1, 2], [3, 4]]) print(c*d) # [[4 6] # [6 4]]
要获得矩阵乘法的结果,可以使用np.dot(或Python >= 3.5中的@,如上所示):
np.dot
print(np.dot(c,d)) # [[13 20] # [ 5 8]]
**操作符的行为也不同:
**
print(a**2) # [[22 15] # [10 7]] print(c**2) # [[16 9] # [ 4 1]]
a**2
a*a
c
c**2
np.ravel
如果你愿意放弃NumPy矩阵产品的视觉吸引力 (在Python >= 3.5中使用ndarray几乎可以同样优雅地实现),那么我认为NumPy数组绝对是可行的方法 < p > p。当然,你真的不必以牺牲另一个为代价来选择一个, 因为np.asmatrix和np.asarray允许你将其中一个转换为另一个 只要数组是二维的)。
np.asmatrix
np.asarray
NumPy arrays和NumPy matrixes 在这里之间的区别概要。
arrays
matrix
只是在unutbu的列表中添加一个案例。
对我来说,numpy ndarray与numpy矩阵或像matlab这样的矩阵语言相比,最大的实际区别之一是在约简操作中不保留维数。矩阵总是二维的,而数组的均值,例如,有一个维度少。
例如降低矩阵或数组的行:
与矩阵
>>> m = np.mat([[1,2],[2,3]]) >>> m matrix([[1, 2], [2, 3]]) >>> mm = m.mean(1) >>> mm matrix([[ 1.5], [ 2.5]]) >>> mm.shape (2, 1) >>> m - mm matrix([[-0.5, 0.5], [-0.5, 0.5]])
与数组
>>> a = np.array([[1,2],[2,3]]) >>> a array([[1, 2], [2, 3]]) >>> am = a.mean(1) >>> am.shape (2,) >>> am array([ 1.5, 2.5]) >>> a - am #wrong array([[-0.5, -0.5], [ 0.5, 0.5]]) >>> a - am[:, np.newaxis] #right array([[-0.5, 0.5], [-0.5, 0.5]])
Scipy.org建议您使用数组
* “数组”还是“矩阵”?我应该用哪一种?——简短的回答 使用数组。 它们支持中支持的多维数组代数 李MATLAB < / > 它们是NumPy的标准向量/矩阵/张量类型。许多 NumPy函数返回数组,而不是矩阵 有一个明确的 元素操作和线性代数之间的区别 李操作。< / > 你可以有标准向量或行/列向量,如果你 李。< / > 直到Python 3.5,使用数组类型的唯一缺点 是你必须使用dot而不是*来乘(减)2 张量(标量积,矩阵向量乘法等)。自 Python 3.5可以使用矩阵乘法@运算符 鉴于上述情况,我们打算最终弃用matrix。
* “数组”还是“矩阵”?我应该用哪一种?——简短的回答
使用数组。
dot
*
鉴于上述情况,我们打算最终弃用matrix。
正如其他人所提到的,也许matrix的主要优点是它为矩阵乘法提供了一个方便的符号。
然而,在Python 3.5中,终于有了一个用于矩阵乘法的专用中缀运算符: @。
在最近的NumPy版本中,它可以与ndarrays一起使用:
ndarray
A = numpy.ones((1, 3)) B = numpy.ones((3, 3)) A @ B
所以现在,当你有疑问的时候,你应该坚持ndarray。
根据官方文件,不再建议使用矩阵类,因为它将在未来被删除。
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
正如其他答案已经声明的那样,您可以使用NumPy数组实现所有操作。
使用矩阵的一个优点是通过文本而不是嵌套的方括号更容易实例化。
你可以用矩阵来做
np.matrix("1, 1+1j, 0; 0, 1j, 0; 0, 0, 1")
并直接获得所需的输出:
matrix([[1.+0.j, 1.+1.j, 0.+0.j], [0.+0.j, 0.+1.j, 0.+0.j], [0.+0.j, 0.+0.j, 1.+0.j]])
如果你使用数组,这是行不通的:
np.array("1, 1+1j, 0; 0, 1j, 0; 0, 0, 1")
输出:
array('1, 1+1j, 0; 0, 1j, 0; 0, 0, 1', dtype='<U29')
我想继续更新这个答案 如果一些用户有兴趣查找关于矩阵和numpy的信息,关于numpy数组的矩阵操作
作为公认的答案,numpy-ref.pdf说:
类numpy。矩阵将在未来被删除。
a = np.array([[1,3],[-2,4]]) b = np.array([[3,-2],[5,6]])
矩阵乘法(中缀矩阵乘法)
a@b array([[18, 16], [14, 28]])
置:
ab = a@b ab.T array([[18, 14], [16, 28]])
矩阵的逆:
np.linalg.inv(ab) array([[ 0.1 , -0.05714286], [-0.05 , 0.06428571]]) ab_i=np.linalg.inv(ab) ab@ab_i # proof of inverse array([[1., 0.], [0., 1.]]) # identity matrix
矩阵的行列式。
np.linalg.det(ab) 279.9999999999999
求解线性方程组:
1. x + y = 3, x + 2y = -8 b = np.array([3,-8]) a = np.array([[1,1], [1,2]]) x = np.linalg.solve(a,b) x array([ 14., -11.]) # Solution x=14, y=-11
特征值和特征向量:
a = np.array([[10,-18], [6,-11]]) np.linalg.eig(a) (array([ 1., -2.]), array([[0.89442719, 0.83205029], [0.4472136 , 0.5547002 ]])