杨桃的Python进阶讲座8——数组array(一)数组array和矩阵matrix

本人CSDN博客专栏:https://blog.csdn.net/yty_7

Github地址:https://github.com/yot777/

 

Python在引入numpy模块之前,只能使用一维列表例如[1,2,3]。引入了numpy模块之后,可以扩展到二维、三维直到n维数组。

在使用数组或矩阵之前都必须在Python程序的第一行加上

import numpy as np

8.1 数组和矩阵的定义

array:数组

matrix(可简写为mat):矩阵

matrix是array的分支,matrix和array在表示二维的时候基本上是通用的(例如两者都可以进行转置)。

但在非二维的情况下,有以下显著不同:

matrix仅能表示二维矩阵,即使输入的是一个一维列表,也会把它强制转为二维矩阵。

array不仅能表示二维数组,还能表示1、3、4、5...n维,二维数组也可以叫做矩阵。

Python官方建议在两个都可以使用的场合选择array,因为array更灵活,速度更快。


8.2 数组和矩阵的维度表达式

数组和矩阵的维度表达式(m,n):m是行数,n是列数

使用shape()函数可以得到数组(或矩阵)的行数和列数(m,n)

特别的,当m=1时的二维数组(1,n)称为行向量,当n=1的二维数组(m,1)称为列向量列向量可以简称为向量。

杨桃的Python进阶讲座8——数组array(一)数组array和矩阵matrix_第1张图片

数组和矩阵既可以直接用np.array()函数定义,也可以用列表转换而来。

注意列表元素之间用逗号分隔,但数组元素之间用空格分隔。

数组或矩阵都可以做行列互换,称为转置,用.T或者transpose()函数来实现。

#数组和矩阵转置举例
import numpy as np

p=[[1,2]]
p.append([3,4])
p.append([5,6])
#q是二维数组
q=np.array(p)
print("q=\n",q)
print("q的维度是",np.shape(q))
#s是二维数组q的转置
s=q.T
print("s=\n",s)
print("s的维度是",np.shape(s))
#u是矩阵
u=np.matrix(p)
print("u=\n",u)
print("u的维度是",np.shape(u))
#v是矩阵u的转置
v=u.transpose()
print("v=\n",v)
print("v的维度是",np.shape(v))

运行结果:
q=
 [[1 2]
 [3 4]
 [5 6]]
q的维度是 (3, 2)
s=
 [[1 3 5]
 [2 4 6]]
s的维度是 (2, 3)
u=
 [[1 2]
 [3 4]
 [5 6]]
u的维度是 (3, 2)
v=
 [[1 3 5]
 [2 4 6]]
v的维度是 (2, 3)

怎样判断数组的维度呢?连续左括号(右括号也可以)的个数有几个就是几维数组

例如:array([1,2,3])是一维数组,array([[1,2],[3,4],[5,6]])是二维数组,

array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])是三维数组。

列表维度举例:

#列表维度举例
import numpy as np

a=np.array([1,2,3])
b=np.array([[1,2],[3,4],[5,6]])
c=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])
print("a=\n",a)
print("a的维度是",np.shape(a))
print("b=\n",b)
print("b的维度是",np.shape(b))
print("c=\n",c)
print("c的维度是",np.shape(c))

运行结果:
a=
 [1 2 3]
a的维度是 (3,)
b=
 [[1 2]
 [3 4]
 [5 6]]
b的维度是 (3, 2)
c=
 [[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]

 [[13 14 15]
  [16 17 18]]]
c的维度是 (3, 2, 3)

对于数组c的维度 (3, 2, 3)怎样理解呢?其实就是3个(2,3)二维数组。

一维数组举例:

import numpy as np

array1=np.array([1,2,3])
print("array1=\n",array1)
print("array1的维度是",np.shape(array1))

mat1=np.mat([1,2,3])
print("mat1=\n",mat1)
print("mat1的维度是",np.shape(mat1))

运行结果:
array1=
 [1 2 3]
array1的维度是 (3,)
mat1=
 [[1 2 3]]
mat1的维度是 (1, 3)

可见matrix将一维列表强制变成了二维矩阵(1,3)。

 

矩阵的维度不能超过2,否则会报错:

#矩阵的维度超过2
import numpy as np

mat5=np.mat([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])
print("mat5=\n",mat5)
print("mat5的维度是",np.shape(mat5))

运行结果:
mat4=
 [[1 2 3]
 [4 5 6]]
mat4的维度是 (2, 3)
Traceback (most recent call last):
  File "test1.py", line 7, in 
    mat5=np.mat([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])
  File "C:\Users\yty7\AppData\Roaming\Python\Python36\site-packages\numpy\matrixlib\defmatrix.py", line 71, in asmatrix
    return matrix(data, dtype=dtype, copy=False)
  File "C:\Users\yty7\AppData\Roaming\Python\Python36\site-packages\numpy\matrixlib\defmatrix.py", line 151, in __new__
    raise ValueError("matrix must be 2-dimensional")
ValueError: matrix must be 2-dimensional

可见,matrix不支持三维矩阵,因此程序报错:matrix must be 2-dimensional

 

8.3 数组相乘和矩阵相乘

两个矩阵相乘,用符号*即可,但是array作为矩阵相乘要使用方法.dot()

array如果用*号直接相乘,得到的是两个矩阵中对应元素的乘积。

矩阵相乘的简单记忆法:m行n列矩阵,可以和它相乘的矩阵必须是n行,矩阵(m,n)乘以矩阵(n,s)得到新的矩阵是(m,s)

杨桃的Python进阶讲座8——数组array(一)数组array和矩阵matrix_第2张图片

杨桃的Python进阶讲座8——数组array(一)数组array和矩阵matrix_第3张图片

杨桃的Python进阶讲座8——数组array(一)数组array和矩阵matrix_第4张图片

numpy.array乘法和dot()乘法举例:

import numpy as np

array1=np.array([[1,2,3],[4,5,6],[7,8,9]])
array2=np.array([[1],[2],[3]])
print("array1=\n",array1)
print("array2=\n",array2)

#数组相乘
array3 = array1*array2
print("array3=\n",array3)

#数组dot()相乘
array4 = array1.dot(array2)
print("array4=\n",array4)

运行结果:
array1=
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
array2=
 [[1]
 [2]
 [3]]
array3=
 [[ 1  2  3]
 [ 8 10 12]
 [21 24 27]]
array4=
 [[14]
 [32]
 [50]]

可见,array作为矩阵相乘要使用方法.dot(),array如果用*号直接相乘,得到的是两个矩阵中对应元素的乘积。

numpy.matrix乘法举例:

import numpy as np

mat1=np.mat([[1,2,3],[4,5,6],[7,8,9]])
mat2=np.mat([[1],[2],[3]])
print("mat1=\n",mat1)
print("mat2=\n",mat2)

#矩阵相乘
mat3 = mat1*mat2
print("mat3=\n",mat3)

#矩阵dot()相乘
mat4 = mat1.dot(mat2)
print("mat4=\n",mat4)

运行结果:
mat1=
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
mat2=
 [[1]
 [2]
 [3]]
mat3=
 [[14]
 [32]
 [50]]
mat4=
 [[14]
 [32]
 [50]]

实际上在大部分Python程序里,array更常用

 

总结:

numpy的array数组和matrix矩阵在二维情况下相似。

matrix仅能表示二维矩阵。array不仅能表示二维数组,还能表示1、3、4、5...n维。

数组和矩阵的维度表达式(m,n):m是行数,n是列数。

特别的,当m=1时的二维数组(1,n)称为行向量,当n=1的二维数组(m,1)称为列向量列向量可以简称为向量。

两个矩阵相乘,用符号*即可,但是array作为矩阵相乘要使用方法.dot()

array如果用*号直接相乘,得到的是两个矩阵中对应元素的乘积。

m行n列矩阵,可以和它相乘的矩阵必须是n行,矩阵(m,n)乘以矩阵(n,s)得到新的矩阵是(m,s)

 

本人CSDN博客专栏:https://blog.csdn.net/yty_7

Github地址:https://github.com/yot777/

如果您觉得本篇本章对您有所帮助,欢迎关注、评论、点赞!Github欢迎您的Follow、Star!

 

你可能感兴趣的:(讲座,Python,python)