numpy数组和矩阵之间有什么区别?我应该使用哪一个?
NumPy中的ndarray和矩阵之间的区别是什么?我应该使用哪一个?
numpy中的ndarray和矩阵之间有一些实际的区别,特别是在降维运算中。矩阵始终是二维的,而数组的均值等操作会减少一个维度。
比如,对矩阵或数组进行行标准化操作:
使用矩阵:
>>> 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 #错误 array([[-0.5, -0.5], [ 0.5, 0.5]]) >>> a - am[:, np.newaxis] #正确 array([[-0.5, 0.5], [-0.5, 0.5]])
此外,同时使用数组和矩阵可能会导致许多调试时间的损失。
然而,scipy.sparse矩阵在乘法等运算中始终保持矩阵形式。
在numpy中,有两种主要的数据类型可以用来表示多维数组:数组(array)和矩阵(matrix)。那么,这两者有什么区别呢?哪种应该被使用呢?
根据Scipy.org的建议,我们应该使用数组(array)。以下是一些使用数组的原因:
1. 数组支持在MATLAB中支持的多维数组代数运算。
2. 数组是NumPy的标准向量/矩阵/张量类型。许多NumPy函数返回的是数组,而不是矩阵。
3. 数组操作和线性代数操作之间有明显的区别。
4. 数组可以表示标准向量或行/列向量。
在Python 3.5之前,使用数组的唯一缺点是必须使用dot
来代替*
进行张量(标量积、矩阵向量相乘等)乘法运算。但是自从Python 3.5引入了矩阵乘法运算符@
后,这个缺点也被弥补了。因此,鉴于上述原因,Scipy.org打算最终弃用矩阵(matrix)类型。
虽然上述答案提供了更多信息,真正的答案确实是坚持使用ndarray
。使用matrix
的主要论点是,如果你的代码涉及大量的线性代数运算,并且使用dot
函数会使代码看起来不够清晰。但是,随着Python 3.5和最新版的NumPy接受使用矩阵乘法运算符@
,这个论点将不复存在。因此,在新代码中最好使用ndarray
。
然而,这个页面忽略了scipy.sparse
矩阵。如果你的代码同时使用稠密矩阵和稀疏矩阵,那么坚持使用matrix
会更容易。
在我看来,数组的主要缺点是列切片返回的是扁平数组,这可能会令人困惑,并且在数学上并不完全正确。这也导致了一个重要的缺点,即numpy数组不能像scipy.sparse矩阵一样进行处理,而numpy矩阵基本上可以自由地与稀疏矩阵交换。在这种情况下,Scipy.org建议使用数组,但却没有提供兼容的稀疏数组。
根据Scipy.org的建议,使用数组(array)是更好的选择。然而,如果你的代码涉及大量的线性代数运算,且使用dot
函数不够清晰,那么可以考虑使用矩阵(matrix)。此外,如果你的代码同时使用稠密矩阵和稀疏矩阵,那么使用矩阵(matrix)可能更方便。
NumPy中的数组(arrays)和矩阵(matrices)之间有哪些区别?我应该使用哪一个?
问题的出现原因:
NumPy中引入了数组(arrays)和矩阵(matrices)这两种数据结构,它们在某些操作上有不同的表现。这些区别可能会导致用户对于哪种数据结构更适合自己的需求感到困惑。
解决方法:
1. NumPy中的矩阵(matrices)是严格的二维数据结构,而数组(arrays)(ndarrays)可以是任意维度的数据结构。矩阵对象是ndarray的子类,所以它们继承了ndarrays的所有属性和方法。
2. NumPy矩阵的主要优势在于它们提供了一种方便的矩阵乘法表示方法:如果a和b是矩阵,那么a*b就是它们的矩阵乘积。而在Python 3.5及以上的版本中,NumPy也支持使用@运算符进行矩阵乘法。
3. 矩阵对象和ndarrays都有.T属性来返回转置矩阵,但是矩阵对象还有.H属性用于返回共轭转置矩阵,以及.I属性用于返回逆矩阵。
4. 数组(ndarrays)在所有操作上都是按照元素逐个进行的(除了新的@运算符)。所以,如果a和b是数组,那么a*b就是元素逐个相乘的结果。
5. 要获得矩阵乘法的结果,可以使用np.dot函数(或者在Python 3.5及以上版本中使用@运算符)。
6. 数组和矩阵之间还有其他一些技术上的区别,比如np.ravel、元素选择和序列行为等方面的差异。
NumPy数组更加通用,可以支持任意维度的数据结构,而矩阵则局限于二维。如果需要使用三维数组,就必须使用数组(ndarray)而非矩阵(matrix)对象。如果只使用数组(ndarrays),那么可以完成矩阵对象的所有操作,并且还可以进行更多其他操作。所以,如果不考虑矩阵乘法的可视化表示(在Python 3.5及以上版本中,使用ndarrays的@运算符也可以实现类似的表示),那么建议使用NumPy数组(ndarrays)。
PS. 当然,你不需要在这两者之间做出选择,因为np.asmatrix和np.asarray函数可以相互转换(前提是数组是二维的)。
NumPy中的数组(arrays)和矩阵(matrices)在某些操作上有不同的表现,主要区别如下:
1. 数组(ndarrays)是N维的,而矩阵(matrices)是严格的二维数据结构。
2. 矩阵对象提供了方便的矩阵乘法表示方法,而数组则按照元素逐个进行操作。
3. 数组和矩阵都有转置属性(.T),但矩阵对象还有共轭转置属性(.H)和逆矩阵属性(.I)。
4. 使用数组可以完成矩阵对象的所有操作,并且还可以进行更多其他操作。
5. 如果不考虑矩阵乘法的可视化表示,建议使用数组(ndarrays)。
参考链接:
https://www.numpy.org/devdocs/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i-use