numpy 矩阵和数组的区别和选择


乘积的区别

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*b)
# [[13 20]
#  [ 5  8]]

而另一方面,在 Python >= 3.5 中,NumPy支持使用@操作符进行矩阵乘法,因此,也可以对n维数组(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]]

矩阵和n维数组都有’.T‘操作符进行转置,但矩阵还有’.H‘表示共轭转置,’.I‘表示逆。

numpy数组始终遵循这样的规则,即操作是按元素的方式应用的(新增的@操作符除外)。因此,如果a和b是numpy数组,那么a*b就是按元素乘法组成的数组:


import numpy as np

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

要让上面的数组输出矩阵乘积,则应该用上面的@,或者写:


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**返回矩阵乘积a*a。而因为c是一个n维数组,所以c**返回一个n维数组 ,其中每个元素都是平方的结果。


用数组还是矩阵?

numpy数组的主要优点是它们比二维矩阵更通用。当你想要一个三维数组时怎么办?你必须使用ndarray,而不是矩阵对象。因此,学习使用矩阵对象更进一步的工作——你必须学习矩阵对象操作和ndarray操作。

编写一个混合了矩阵和数组的程序会会让工作变得复杂,因为你必须跟踪你的变量是什么类型的对象,以免乘法会返回一些期望之外的东西。

相反,如果只使用ndarrays,那么你也可以完成矩阵对象所能完成的一切,甚至更多,除了使用稍微不同的函数/表示法。

如果愿意放弃NumPy矩阵乘积表示法的简便性(当然,在Python >= 3.5中n维数组也可以用@实现),那么NumPy数组肯定是最好的选择。

当然,也不需要以牺牲另一个为代价来选择一个,因为np.asmatrixnp.asarray函数可以对数组和矩阵进行转换(只要数组是二维的)。






公众号

关注公众号,获取一手资讯

“ numpy 矩阵和数组的区别和选择 ” comments 0

评论/回复

电子邮件地址不会被公开。 必填项已用*标注