numpy数组和matrix之间有什么区别? 我应该使用哪一个?

每个的优点和缺点是什么?

从我所看到的情况来看,如果需要的话,任何一方都可以替代另一方,所以我应该使用两者还是应该坚持其中之一?

程序的风格会影响我的select吗? 我正在做一些使用numpy的机器学习,所以确实有很多的matrix,但也有很多vector(数组)。

Numpymatrix是严格二维的,而numpy数组(nndarrays)是N维的。 matrix对象是ndarray的子​​类,所以它们inheritance了ndarray的所有属性和方法。

numpymatrix的主要优点是它们为matrix乘法提供了方便的符号:如果a和b是matrix,则a * b是它们的matrix积。

 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支持使用@运算符的中缀matrix乘法,因此您可以在Python> = 3.5的情况下使用与ndarrays相同的matrix乘法。

 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]] 

matrix对象和ndarrays都有返回的转置,但是matrix对象也有共轭转置的.H和反向的。

相比之下,numpy数组始终遵守操作按元素应用的规则(除了新的@操作符)。 因此,如果ab是numpy数组,那么a*b是通过将这些分量相乘而形成的数组:

 c=np.array([[4, 3], [2, 1]]) d=np.array([[1, 2], [3, 4]]) print(c*d) # [[4 6] # [6 4]] 

要获得matrix乘法的结果,可以使用np.dot (或者在Python> = 3.5中@ ,如上所示):

 print(np.dot(c,d)) # [[13 20] # [ 5 8]] 

**运营商也有不同的performance:

 print(a**2) # [[22 15] # [10 7]] print(c**2) # [[16 9] # [ 4 1]] 

由于a是matrix, a**2返回matrix乘积a*a 。 因为c是一个ndarray,所以c**2返回一个ndarray,每个元素都是平方的。

matrix对象和ndarrays之间还有其他的技术差异(与np.ravel,项目select和序列行为有关)。

numpy数组的主要优点在于它们比二维matrix更普遍。 当你想要一个三维数组时,会发生什么? 那么你必须使用一个ndarray,而不是一个matrix对象。 因此,学习使用matrix对象是更多的工作 – 你必须学习matrix对象操作和ndarray操作。

编写一个使用matrix和数组的程序会让你的生活变得困难,因为你必须跟踪你的variables是什么types的对象,以免乘法返回你不期望的东西。

相比之下,如果你坚持使用ndarrays,那么你可以做所有的matrix对象可以做的,除了稍微不同的function/符号之外。

如果你愿意放弃NumPymatrix产品符号的视觉吸引力(这可以在Python> = 3.5的情况下用优雅的方式实现),那么我认为NumPy数组肯定是要走的路。

PS。 当然,你不必select牺牲另一个,因为np.asmatrixnp.asarray允许你将一个转换为另一个(只要数组是二维的)。

Scipy.orgbuild议您使用数组:

*'数组'或'matrix'? 我应该用哪个? – 简短的回答

使用数组。

  • 它们是numpy的标准向量/matrix/张量types。 许多numpy函数返回数组,而不是matrix。

  • 元素操作和线性代数操作之间有明显的区别。

  • 如果你喜欢,你可以有标准向量或行/列向量。

使用数组types的唯一缺点是你将不得不用*来代替*乘(减)两个张量(标量积,matrix向量乘等)。

只要给unutbu的名单增加一个案例。

对于我来说,与numpymatrix或像matlab这样的matrix语言相比,numpy ndarrays最大的实际区别之一就是这个维度在减less操作时不会被保留下来。 matrix总是2d,而数组的平均值例如less一个维度。

例如,一个matrix或数组的行数:

与matrix

 >>> 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]]) 

我也认为混合数组和matrix会产生许多“快乐”的debugging时间。 然而,scipy.sparsematrix在乘法等运算符总是matrix。

正如其他人所提到的, matrix的主要优点也许是为matrix乘法提供了一个方便的符号。

但是, 在Python 3.5中,最后有一个matrix乘法的专用中缀运算符 : @

使用最近的NumPy版本,它可以用于ndarray s:

 A = numpy.ones((1, 3)) B = numpy.ones((3, 3)) A @ B 

所以,现在,更有甚者,如果有疑问的话,你应该坚持做ndarray