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数组始终遵守操作按元素应用的规则(除了新的@
操作符)。 因此,如果a
和b
是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.asmatrix
和np.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
。