1. # 导入 numpy
  2. import numpy as np

mat() 函数与 array() 函数的区别

  • mat()函数中数据可以为字符串以分号(;)分割或者为列表形式以逗号(,)分割,而array()函数中数据只能为后者形式
  • 两者的类型不同,用mat函数转换为矩阵后才能进行一些线性代数的操作
  1. a1 = np.mat('1, 3; 2, 4')
  2. a2 = np.mat([[1, 3], [2, 4]])
  3. print(a1)
  4. print('a1的类型:', type(a))
  5. print('a2:', a2)
  1. [[1 3]
  2. [2 4]]
  3. a1的类型: <class 'numpy.matrix'>
  4. a2 [[1 3]
  5. [2 4]]
b = np.array([[1, 2], [1, 3]])
print(b)
print('b的类型:', type(b))
[[1 2]
 [1 3]]
b的类型: <class 'numpy.ndarray'>

创建常用矩阵

随机矩阵

array1 = np.random.rand(4, 4)
print(array1)
print(type(array1))

# 将 ndarray 类型转为 matrix 类型
matrix1 = np.mat(array1)
print(matrix1)
print(type(matrix1))
[[0.108369   0.67194745 0.70255467 0.73207351]
 [0.87105564 0.37146943 0.97825763 0.98789354]
 [0.34650917 0.64605897 0.65585639 0.99987454]
 [0.54715213 0.17730709 0.90696935 0.12732245]]
<class 'numpy.ndarray'>
[[0.108369   0.67194745 0.70255467 0.73207351]
 [0.87105564 0.37146943 0.97825763 0.98789354]
 [0.34650917 0.64605897 0.65585639 0.99987454]
 [0.54715213 0.17730709 0.90696935 0.12732245]]
<class 'numpy.matrix'>
# 可以直接使用 np.mat()
data1 = np.mat(np.random.rand(2, 2))
print(data1)
print(type(data1))
[[0.68738148 0.1223296 ]
 [0.4243208  0.23562135]]
<class 'numpy.matrix'>
# 生成一个 3*3 的 0-10 之间的随机整数矩阵
data2 = np.mat(np.random.randint(10, size = (3, 3)))
print(data2)
[[0 3 2]
 [7 0 5]
 [7 8 5]]
# 生成一个 3*3 的 2-8 之间的随机整数矩阵
data3 = np.mat(np.random.randint(2, 8, size=(3,3)))
print(data3)
[[3 3 7]
 [5 4 3]
 [7 2 5]]

0 矩阵

zeroMat = np.mat(np.zeros((3, 3))) # 注意 zeros 的参数是一个元组
print(zeroMat)
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
zeroArray = np.zeros(3) # 生成一个一维的全 0 数组
print(zeroArray)
print(type(zeroArray))
[0. 0. 0.]
<class 'numpy.ndarray'>

1 矩阵

onesMat = np.mat(np.ones((3, 4)))
print(onesMat)
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
onesArr = np.ones(4) # 生成一个全为 1 的数组
print(onesArr)
print(type(onesArr))
[1. 1. 1. 1.]
<class 'numpy.ndarray'>

对角矩阵

data4 = np.mat(np.eye(2, 3, dtype=int))
print(data4)
[[1 0 0]
 [0 1 0]]
# 生成一个对角线为 1, 2, 3 的对角矩阵
array_1 = [1, 2, 3]
array_2 = np.mat(np.diag(array_1))
print(array_2)
[[1 0 0]
 [0 2 0]
 [0 0 3]]

full, 自定义形状

  • numpy.full(shape,fill_value=num)用于创建一个自定义形状的数组,可以自己指定一个值,用它填满整个数组。
  • fill_value 用来填充的值,可以是数字,也可以是字符串
np_full = np.full(shape=(2, 3, 4), fill_value=5)
print(np_full)
[[[5 5 5 5]
  [5 5 5 5]
  [5 5 5 5]]

 [[5 5 5 5]
  [5 5 5 5]
  [5 5 5 5]]]
np_full2 = np.full(shape=(2, 3, 4), fill_value='ai')
print(np_full2)
print(type(np_full2))
[[['ai' 'ai' 'ai' 'ai']
  ['ai' 'ai' 'ai' 'ai']
  ['ai' 'ai' 'ai' 'ai']]

 [['ai' 'ai' 'ai' 'ai']
  ['ai' 'ai' 'ai' 'ai']
  ['ai' 'ai' 'ai' 'ai']]]
<class 'numpy.ndarray'>

常见矩阵操作

矩阵相乘 *

mat1 = np.mat([1, 2, 3])
mat2 = np.mat([[1], [2], [3]])
result = mat1*mat2    # 矩阵相乘
print(result)

mat3 = np.mat([[1, 2], [2, 3], [3, 4]])
result2 = mat1 * mat3
print(result2)

list1 = result2.tolist() # 将matrix 变换为 list, 可以通过下标获得值
print(list1)
print(list1[0][0])

arr1 = np.array(result2) # 将matrix 变换为 ndarray, 可以通过下标获得值
print(arr1)
print(arr1[0][0])
[[14]]
[[14 20]]
[[14, 20]]
14
[[14 20]]
14

矩阵点乘 multiply

对应元素相乘

mat4 = np.mat([2, 3])
mat5 = np.mat([3, 4])
result3 = np.multiply(mat4, mat5)
print(result3)
[[ 6 12]]

矩阵求逆变换 .I

mat6 = np.mat(np.eye(3, 3)*0.5)
print(mat6)
mat7 = mat6.I
print('矩阵的逆:')
print(mat7)
[[0.5 0.  0. ]
 [0.  0.5 0. ]
 [0.  0.  0.5]]
矩阵的逆:
[[2. 0. 0.]
 [0. 2. 0.]
 [0. 0. 2.]]

矩阵求转置 .T

mat8 = np.mat([[1, 1], [0, 0]])
mat9 = mat8.T
print('原矩阵:')
print(mat8)
print('矩阵的转置:')
print(mat9)
原矩阵:
[[1 1]
 [0 0]]
矩阵的转置:
[[1 0]
 [1 0]]

计算行列式 np.linalg.det

Y = np.reshape(np.arange(20), (5, 2, 2))
print(Y)
print('行列式的值为:')
detVal = np.linalg.det(Y[0])
print(detVal)
[[[ 0  1]
  [ 2  3]]

 [[ 4  5]
  [ 6  7]]

 [[ 8  9]
  [10 11]]

 [[12 13]
  [14 15]]

 [[16 17]
  [18 19]]]
行列式的值为:
-2.0

求矩阵的特征值和特征向量 np.linalg.eig

Z = [
    [-1, 1, 0],
    [-4, 3, 0],
    [1, 0, 2]
]
print('Z=', Z)
# 求特征值 和 特征向量
eigenValue, featureVector = np.linalg.eig(Z)
print('特征值为:', eigenValue)
print('特征向量为:', featureVector)
Z= [[-1, 1, 0], [-4, 3, 0], [1, 0, 2]]
特征值为: [2. 1. 1.]
特征向量为: [[ 0.          0.40824829  0.40824829]
 [ 0.          0.81649658  0.81649658]
 [ 1.         -0.40824829 -0.40824829]]

求矩阵对应列(行)的最大值、最小值、和

mat10 = np.mat([[1, 2], [3, 4], [5, 6]])
print(mat10)

# 列和,这里得到的是 1*2 的矩阵
sum_Col = mat10.sum(axis=0)
print('列和:')
print(sum_Col)

# 行和, 这里得到的是 3*1 的矩阵
sum_row = mat10.sum(axis=1)
print('行和:')
print(sum_row)

# 计算第一行所有列的和
sum_firstRow = np.sum(mat10[0, :])
print('第一行让所有列的和:')
print(sum_firstRow)
[[1 2]
 [3 4]
 [5 6]]
列和:
[[ 9 12]]
行和:
[[ 3]
 [ 7]
 [11]]
第一行让所有列的和:
3

计算最大、最小值、索引

mat11 = np.mat([[1, 2], [3, 4], [5, 6]])

# 计算 mat11 中所有元素的最大值
max1 = mat11.max()
print('最大值为:', max1)
# 计算 mat11 第二列最大值,得到一个1*1的矩阵
max2 = np.max(mat11[:, 1])
print('第二列最大值:', max2)
# 计算 mat11 第二行最大值
max3 = np.max(mat11[1, :])
print('第二行最大值:', max3)
# 计算所有行的最大值
max4 = np.max(mat11, 1)
print('所有行的最大值:')
print(max4)
# 计算所有列的最大值
max5 = np.max(mat11, 0)
print('所有列的最大值:')
print(max5)
最大值为: 6
第二列最大值: 6
第二行最大值: 4
所有行的最大值:
[[2]
 [4]
 [6]]
所有列的最大值:
[[5 6]]

矩阵的分隔与合并(切片, vstack, hstack)

矩阵的分隔

矩阵的分隔,同列表和数组的分割一致。

diagArr = [1, 2, 3]
mat12 = np.mat(np.diag(diagArr))
print(mat12)
mat13 = mat12[1:, 1:]
print('分隔后:')
print(mat13)
[[1 0 0]
 [0 2 0]
 [0 0 3]]
分隔后:
[[2 0]
 [0 3]]

矩阵的合并 (vstack, hstack)

mat14 = np.ones((3, 3))
print(mat14)
mat15 = np.eye(3)
print(mat15)
# 按行合并,增加扩展列数
mat15_1 = np.hstack((mat14, mat15))
print('按行合并:')
print(mat15_1)
# 按列合并,增加行数
mat15_2 = np.vstack((mat14, mat15))
print('按列合并:')
print(mat15_2)
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
按行合并:
[[1. 1. 1. 1. 0. 0.]
 [1. 1. 1. 0. 1. 0.]
 [1. 1. 1. 0. 0. 1.]]
按列合并:
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

数组叠加合并 column_stack, row_stack

arr1 = [1, 2, 3, 4]
arr2 = [5, 6, 7, 8]
matCol = np.column_stack((arr1, arr2))
print(matCol)
matRow = np.row_stack((arr1, arr2))
print(matRow)
[[1 5]
 [2 6]
 [3 7]
 [4 8]]
[[1 2 3 4]
 [5 6 7 8]]

数组均分 np.array_split

arr = np.arange(20)
print(arr)

split1 = np.array_split(arr, 2)
print('平均分为2个:')
print(split1)
for i in range(len(split1)):
    print(split1[i].tolist())

split2 = np.array_split(arr, 5)
print('平均分为5个:')
print(split2)
for i in range(len(split2)):
    print(split2[i].tolist())
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
平均分为2个:
[array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
平均分为5个:
[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10, 11]), array([12, 13, 14, 15]), array([16, 17, 18, 19])]
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
[16, 17, 18, 19]

矩阵、列表、数组的转换

列表的特点

列表可以修改,并且列表中元素可以使不同类型的数据,如下:

li = [12, 'hello', a]

numpy 数组的特点

numpy中数组,同一个数组中所有元素必须为同一个类型,有几个常见的属性:

  • ndim 维度
  • shape 形状
  • size 总个数
  • dtype 类型
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
print('矩阵的维度:', arr.ndim)
print('矩阵的形状:', arr.shape)
print('矩阵的总个数:', arr.size)
print('矩阵的类型:', arr.dtype)
[[1 2 3]
 [4 5 6]]
矩阵的维度: 2
矩阵的形状: (2, 3)
矩阵的总个数: 6
矩阵的类型: int32

numpy 矩阵的特点

umpy中的矩阵也有与数组常见的几个属性

转换关系

# 列表
li = [[1, 2, 3], [4, 5, 6]]
# 列表 => 数组
arr = np.array(li)
# 列表 => 矩阵
mat = np.mat(arr)
# 矩阵 => 数组
arr2 = np.array(mat)
# 矩阵 => 列表
li2 = mat.tolist()
# 数组 => 列表
li3 = arr.tolist()
print(type(li))
print(type(arr))
print(type(mat))
print(type(arr2))
print(type(li2))
print(type(li3))
1
<class 'list'>
<class 'numpy.ndarray'>
<class 'numpy.matrix'>
<class 'numpy.ndarray'>
<class 'list'>
<class 'list'>

matrix.getA()

getA()是numpy的一个函数,作用是将矩阵转成一个ndarray,getA()函数和mat()函数的功能相反,是将一个矩阵转化为数组。
如果不转,矩阵的每个元素将无法取出,会造成越界的问题,其具体解释如下:

X = np.matrix(np.arange(12).reshape(3, 4))
print(X)
print(type(X))
print(X.getA())
print(type(X.getA()))
print(X[0, 0]) # 获取matrix类型的一个值,只能使用 [x, y]的形式,而不能使用[x][y]
print(X[0][0])
print(X.getA()[0][0]) # 转换为 ndarray 类型后,就可以直接获取值,通过[x][y]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
<class 'numpy.matrix'>
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
<class 'numpy.ndarray'>
0
[[0 1 2 3]]
0

矩阵的切片

行操作

a = [[1,2],[3,4],[5,6],[7, 8]]
a = np.mat(a)
# 打印整个矩阵
print('整个矩阵:')
print(a[0:])
print('从第二行开始打印:')
print(a[1:])
print('从第二行到第三行:')
print(a[1:3])
整个矩阵:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
从第二行开始打印:
[[3 4]
 [5 6]
 [7 8]]
从第二行到第三行:
[[3 4]
 [5 6]]

列操作

a = [[1,2],[3,4],[5,6],[7, 8]]
a = np.mat(a)
print('打印第一列:')
print(a[:, 0])
print('打印第二行到第三行的第二列:')
print(a[1:3, 1])
打印第一列:
[[1]
 [3]
 [5]
 [7]]
打印第二行到第三行的第二列:
[[4]
 [6]]

数据类型的转换 astype dtype

arr = np.array([1, 2, 3, 4, 5])
print(arr)
# 查看数据类型
print('数组的数据类型为:', arr.dtype)
# int32 => int64
arr2 = arr.astype('int64')
print('int32=>int64:', arr2.dtype)
# int32 => float
arr3 = arr.astype('float')
print('int32=>float64', arr3.dtype)
[1 2 3 4 5]
数组的数据类型为: int32
int32=>int64: int64
数组的数据类型为: int32
int32=>float64 float64

字符串转换为数值类型

strArr = np.array(['1.2','2.3','3.2141'])
print(strArr)
numArr = strArr.astype('float')
print('string => float:', numArr)
['1.2' '2.3' '3.2141']
string => float: [1.2    2.3    3.2141]