当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《numpy数组和矩阵之间有什么区别?我应该使用哪一个?》经验,为你挑选了4个好方法。

各有哪些优缺点?

从我所看到的情况来看,如果需要的话,任何一个都可以作为另一个的替代品,那么我是否应该使用它们或者我应该只坚持其中一个?

该计划的风格会影响我的选择吗?我正在使用numpy做一些机器学习,所以确实有很多矩阵,但也有很多向量(数组).



1> unutbu..:

Numpy矩阵是严格的二维矩阵,而numpy数组(ndarray)是N维的.Matrix对象是ndarray的子​​类,因此它们继承了ndarrays的所有属性和方法.

numpy矩阵的主要优点是它们为矩阵乘法提供了方便的符号:如果a和b是矩阵,则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中的ndarrays实现矩阵乘法的相同方便.

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

矩阵对象和ndarray都.T必须返回转置,但矩阵对象也有.H共轭转置和.I反转.

相反,numpy数组始终遵循以元素方式应用操作的规则(除了new @运算符).因此,如果是abnumpy数组,那么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中,如上所示):

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

**运营商还表现不同:

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

由于a是矩阵,a**2返回矩阵乘积a*a.因为c是一个ndarray,c**2返回一个ndarray,每个组件的元素方形平方.

矩阵对象和ndarray之间还存在其他技术差异(与np.ravel,项目选择和序列行为有关).

numpy数组的主要优点是它们比二维矩阵更通用.当你想要一个三维数组时会发生什么?然后你必须使用ndarray,而不是矩阵对象.因此,学习使用矩阵对象是更多的工作 - 你必须学习矩阵对象操作和ndarray操作.

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

相比之下,如果你只使用ndarrays,那么你可以做矩阵对象可以做的所有事情,除了功能/符号略有不同之外.

如果你愿意放弃NumPy矩阵产品符号的视觉吸引力(在Python中使用ndarrays> = 3.5可以很好地实现),那么我认为NumPy数组肯定是要走的路.

PS.当然,你真的不必以牺牲另一个为代价来选择一个,因为np.asmatrixnp.asarray允许你将一个转换为另一个(只要数组是二维的).


还有就是与NumPy之间的差异大纲arraysVS NumPy的matrixES 这里.


对于那些想知道,矩阵的"mat**n"可以用"reduce(np.dot,[arr]*n)"优雅地应用于数组.
或者只是`np.linalg.matrix_power(mat,n)`

2> atomh33ls..:

Scipy.org建议您使用数组:

*'数组'或'矩阵'?我应该使用哪个? - 简短的回答

使用数组.

它们是numpy的标准矢量/矩阵/张量类型.许多numpy函数返回数组,而不是矩阵.

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

如果您愿意,可以使用标准向量或行/列向量.

使用数组类型的唯一缺点是你必须使用dot而不是*乘法(减少)两个张量(标量乘积,矩阵向量乘法等).


尽管接受的答案提供了更多信息,但真正的答案确实是坚持使用`ndarray`.使用`矩阵'的主要论据是,如果你的代码在线性代数中很重,并且对所有对`dot`函数的调用看起来都不那么清晰.但是这个论点将来会消失,现在@ -operator被接受用于矩阵乘法,参见[PEP 465](https://www.python.org/dev/peps/pep-0465/).这将需要Python 3.5和最新版本的Numpy.矩阵类可能在不久的将来被弃用,因此最好将ndarray用于新代码......
那个页面慷慨地忘记了'scipy.sparse`矩阵.如果在代码中同时使用密集和稀疏矩阵,则更容易坚持"矩阵".
在我看来,数组的主要缺点是列切片返回平面数组,这可能令人困惑,并且在数学上并不是真正的声音.这也导致了一个重要的缺点,即numpy数组不能以与scipy.sparse矩阵相同的方式处理,而numpy矩阵基本上可以用稀疏矩阵自由交换.在这种情况下,scipy建议使用数组,然后不提供兼容的稀疏数组.

3> Josef..:

只是将一个案例添加到unutbu的列表中.

与numpy矩阵或matlab等矩阵语言相比,numpy ndarray的最大实际差异之一是,维度不会在reduce操作中保留.矩阵总是2d,而数组的平均值只有一个维度.

例如,矩阵或数组的demean行:

用矩阵

>>> 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.sparse矩阵总是就乘法等运算符而言是矩阵.



4> Peque..:

正如其他人所提到的,也许主要优点matrix是它为矩阵乘法提供了方便的符号.

但是,在Python 3.5中,最终有一个专用的中缀运算符用于矩阵乘法:@.

使用最近的NumPy版本,它可以与ndarrays 一起使用:

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

所以现在,甚至更多,如果有疑问,你应该坚持ndarray.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有