numpy是Python的一种开源的数据计算扩展库,用来存储和处理大型矩阵
-
区别于list列表,提供数组操作,数组运算,以及统计分布和简单的数学模型
-
计算速度快
矩阵即numpy的ndarray对象,创建矩阵就是把一个列表传入np.array()方法
import numpy as np #约定俗成 np代表numpy
#一维
arr = np.array([1,2,3,4])
print(arr)
[1,2,3,4]
#二维
arr = np.array([[1,2,3,4],[5,6,7,8]])
[[1,2,3,4]
[5,6,7,8]]
#三维
[[[1,2,3,4],
[1,2,3,4],
[1,2,3,4]],
[[2,3,4,5],
[3,4,5,6],
[3,4,5,6]],
[[5,6,7,8],
[5,6,7,8],
[5,6,7,8]]]
arr = [[1,2,3]
[4,5,6]]
#获取矩阵的行和列
print(arr.shape)
(2,3)
#获取矩阵的行
print(arr.shape[0])
2
# 获取矩阵的列
print(arr.shape[1])
3
切割矩阵
# 取所有元素
print(arr[:,:])
# 取第一行所有元素
print(arr[:1,:])
print(arr[0,[0,1,2,3,....(n个数则n-1)]])
# 取第一列所有元素
print(arr[:,:1])
print(arr[[0,1,2,3,..],0])
# 取第一行第一列的元素
print(arr[0,0])
#取大于5的元素,返回一个数组
print(arr[arr > 5])
#生成布尔矩阵
print(arr > 5)
[[False False False]
[True False True ]]
矩阵元素替换
类似于列表的替换
# 取第一行所有元素变为0
arr1 = arr.copy()
arr1[:1,:] = 0
print(arr1)
# 去所有大于5的元素变为0
arr2 = arr.copy()
arr2[arr >5] = 0
print(arr2)
#对矩阵清零
arr3 = arr.copy()
arr3[:,:] = 0
print(arr3)
矩阵的合并
arr1 = [[1,2]
[3,4]]
arr2 = [[5,6]
[7,8]]
# 合并矩阵的行,用hstack的合并的话 会具有相同的行
#方法1
np.hstack((arr1,arr2))
[[1,2,5,6]
[3,4,7,8]]
#方法2
print(np.concatenate((arr1,arr2),axis=1))
[[1,2,5,6]
[3,4,7,8]]
# 合并矩阵的列,用vstack
#方法1
np.vstack((arr1,arr2))
[[1,2]
[3,4]
[5,6]
[7,8]]
# 方法2
print(np.contatenate((arr1,arr2),axis=0))
通过函数创建矩阵
arange
print(np.arange(10))#0-9数组
[0 1 2 3 4 5 6 7 8 9]
print(np.arange(1,5))#1-4数组
[1 2 3 4]
print(np.arange(1,20,2))#1-19,步长为2的数组
[1 3 5 7 9 11 13 15 17 19]
linspace/logspace
#构造一个等差数列,取头也取尾
np.linspace(0,20,5)
[0.5.10.15.20]
#构造一个等比数列,从10**0取到10**20,取5个数
np.logspace(0,20,5)
[ 1.00000e+00 1.00000e+05 1.00000e+10 1.00000e+15 1.00000e+20]
zero/ones/eye/empty
#构造全0矩阵
np.zeros((3,4))
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
#构造全1矩阵
np.ones((X,Y))
#构造N个主元的单位矩阵
np.eye(n)
#例
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
#构造一个随机矩阵,里面元素为随机生成
np.empty((x,y))
# fromstring通过对字符串的字符编码所对应ASCII编码的位置,生成一个ndarray对象
s = 'abcdef'
# np.int8表示一个字符的字节数为8
print(np.fromstring(s, dtype=np.int8))
[ 97 98 99 100 101 102]
def func(i, j):
"""其中i为矩阵的行,j为矩阵的列"""
return i*j
# 使用函数对矩阵元素的行和列的索引做处理,得到当前元素的值,索引从0开始,并构造一个3*4的矩阵
print(np.fromfunction(func, (3, 4)))
[[ 0. 0. 0. 0.]
[ 0. 1. 2. 3.]
[ 0. 2. 4. 6.]]
矩阵的运算
+ - * / % **n
矩阵的点乘
必须满足第一个矩阵的列 = 第二个矩阵的行
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr1.shape)
(2, 3)
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(arr2.shape)
(3, 2)
assert arr1.shape[0] == arr2.shape[1]
# 2*3·3*2 = 2*2
print(arr1.dot(arr2))
[[ 58 64]
[139 154]]
矩阵的转置
相当于矩阵的行和列呼唤
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
[[1 2 3]
[4 5 6]]
print(arr.transpose())
[[1 4]
[2 5]
[3 6]]
print(arr.T)
[[1 4]
[2 5]
[3 6]]
矩阵的逆
矩阵行和列相同时候才可逆
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
[[1 2 3]
[4 5 6]
[7 8 9]]
print(np.linalg.inv(arr))
[[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]
[ -6.30503948e+15 1.26100790e+16 -6.30503948e+15]
[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]]
# 单位矩阵的逆是单位矩阵本身
arr = np.eye(3)
print(arr)
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
print(np.linalg.inv(arr))
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]