numpy包

numpy

矩阵

导入库

from numpy import *  # 导入numpy的库函数
import numpy as np  # 使用numpy的函数时以np.开头。

创建矩阵

数组创建矩阵

from numpy import *
a1 = array([1, 2, 3])  # a1 = np.array([1,2,3], dtype=int) 
a1 = mat(a1)  # mat转化为矩阵

常见矩阵

data1 = mat(zeros((3, 3)))  # 创建一个3*3的零矩阵
b1 = np.zeros((2, 3))  # 完整的形式为:zeros(shape,dtype=)
data2 = mat(ones((2, 4)))  # 创建一个2*4的1矩阵,默认是浮点型的数据
data7 = mat(ones((2, 4), dtype = int))  # 创建一个2*4的1的int类型矩阵
data3 = mat(random.rand(2, 2))  # 创建的是一个二维数组,需要将其转换成矩阵
data4 = mat(random.randint(10, size=(3, 3)))  # 生成一个3*3的0-10之间的随机整数矩阵
data5 = mat(random.randint(2, 8, size=(2, 5))  # 产生一个2-8之间的随机整数矩阵
data6 = mat(eye(2, 2, dtype = int))  # 产生一个2*2的对角矩阵

a1 = [1, 2, 3]
a2 = mat(diag(a1))  # 生成一个对角线为1、2、3的对角矩阵

常见矩阵运算

乘法

a1 = mat([1,2])  # 1*2的矩阵,行矩阵
a2 = mat([[1],[2]])  # 2*1的矩阵,列矩阵
a3 = a1*a2  # 1*2的矩阵乘以2*1的矩阵,得到1*1的矩阵

np.dot(a, b) # 计算点积
vdot(a, b)  # 专门计算矢量的点积,和dot()的区别在于对complex数据类型的处理不一样; 
innner(a, b)  # 用来计算内积
outer(a, b)  # 计算外积

点乘

a1 = mat([1, 1])
a2 = mat([2, 2])
a3 = multiply(a1, a2)  # 矩阵对应元素相乘
a4 = mat([2, 2])
a5 = a4 * 2  # 矩阵点乘

求逆

a1 = mat(eye(2, 2) * 0.5) 
a2 = a1.I  # .I表示矩阵的逆

转置

a1 = mat([[1, 1], [0, 0]])
a2 = a1.T  # .T表示矩阵转置

求行\列和

a1 = mat([[1, 1], [2, 3], [4, 2]])
a2 = a1.sum(axis = 0)  # 列和,这里得到的是1*2的矩阵
a3 = a1.sum(axis = 1)  # 行和,这里得到的是3*1的矩阵
a4 = sum(a1[1, :])  # 计算第一行所有列的和,这里得到的是一个数值

最大最小值

a1 = mat([[1, 1], [2, 3], [4, 2]])
a1.max()  # 计算a1矩阵中所有元素的最大值,这里得到的结果是一个数值
a2 = max(a1[:, 1])  # 计算第二列的最大值,这里得到的是一个1*1的矩阵
a1[1, :].max()  # 计算第二行的最大值,这里得到的是一个一个数值

np.max(a1, 0)  # 计算所有列的最大值,这里使用的是numpy中的max函数
np.max(a1, 1)  # 计算所有行的最大值,这里得到是一个矩阵

np.argmax(a1, 0)  # 计算所有列的最大值对应在该列中的索引
np.argmax(a1[1, :])  # 计算第二行中最大值对应在改行的索引

分割合并

# 分割 
a = mat(ones((3, 3)))
b = a[1:, 1:]  # 分割出第二行以后的行和第二列以后的列的所有元素

# 合并 
a = mat(ones((2, 2)))
b = mat(eye(2))
c = vstack((a, b))  # 按列合并,即增加行数
d = hstack((a, b))  # 按行合并,即行数不变,扩展列数

类型转换

l1 = [[1], 'hello', 3]  # 列表中元素可以使不同类型的数据

a = array([[2], [1]])  # numpy中同一个数组中所有元素必须为同一个类型
dimension = a.ndim
m, n = a.shape
number = a.size  # 元素总个数
str = a.dtype  # 元素的类型

a1 = [[1, 2], [3, 2], [5, 2]]  # 列表
a2 = array(a1)  # 将列表转换成二维数组
a3 = array(a1)  # 将列表转化成矩阵
a4 = array(a3)  # 将矩阵转换成数组
a5 = a3.tolist()  # 将矩阵转换成列表
a6 = a2.tolist()  # 将数组转换成列表

a1 = [1, 2, 3]
a2 = array(a1)
a3 = mat(a1)
a4 = a2.tolist()  # 这里得到的是[1,2,3]
a5 = a3.tolist()  # 这里得到的是[[1,2,3]]
a6 = (a4 == a5)  # a6=False
a7 = (a4 is a5[0])  # a7=True,a5[0]=[1,2,3]

dataMat = mat([1])
val = dataMat[0, 0]  # 这个时候获取的就是矩阵的元素的数值,而不再是矩阵的类型

其他

from numpy import *  # 导入numpy的库函数

# 将Python的列表转换成NumPy的矩阵
list = [1, 2, 3]
mat(list)

# 矩阵相乘
m1 = mat([1, 2, 3])  # 1行3列
m2 = mat([4, 5, 6])
m1 * m2.T  # 注意左列与右行相等 m2.T为转置操作

multiply(m1, m2)  # 执行点乘操作,要使用函数,特别注意

# 排序
m = mat([[2, 5, 1], [4, 6, 2]])  # 创建2行3列矩阵
m.sort()  # 对每一行进行排序

m.shape  # 获得矩阵的行列数
m.shape[0]  # 获得矩阵的行数
m.shape[1]  # 获得矩阵的列数

# 索引取值
m[1, :]  # 取得第一行的所有元素
m[1, 0:1]  # 第一行第0个元素,注意左闭右开
m[1, 0:3]
m[1, 0:2]

数组

定义数组

from numpy import *

# 数组定义 
a1 = array([1, 1, 1])  # 定义一个数组
a2 = array([2, 2, 2])

# 定义多维数组 
a3 = array([[1, 2, 3], [4, 5, 6]])
a3[0]  # 取出第一行的数据
a3[0, 0]  # 第一行第一个数据
a3[0][0]  # 也可用这种方式

# 指定数组类型
c = array( [ [1,2], [3,4] ], dtype=complex )

常见函数

import numpy as np

a = np.zeros((2, 2))  # 创建一个全0的数组,或者不加.np直接 zeros((2, 2))
b = np.ones((1, 2))  # 创建一个全1的数组,或者不加.np直接 ones((1, 2))
c = np.full((2, 2), 7)  # 创建一个全为7的2*2的数组
d = np.eye(2)  # 创建一个对角矩阵,对角线全为1
e = np.random.random((2, 2))  # 创建一个2*2的矩阵,元素值随机浮点数
f = enpty((2, 3))  # 内容随机的的2*3的数组
g = arange(10, 30, 5)  # 返回一个首项为10,公差为5的数列,尾项不超过30

数组特征信息

X.flags  # 数组的存储情况信息。
X.shape  # 结果是一个tuple,返回本数组的行数、列数、……
X.ndim  # 数组的维数,结果是一个数
X.size  # 数组中元素的总个数
X.itemsize  # 数组中的每个元素的所占内存空间大小,,单位是字节
X.dtype  # 数据类型
X.data  # 包含实际数组元素的缓冲区,不建议使用
X.T  # 如果X是矩阵,发挥的是X的转置矩阵
X.trace()  # 计算X的迹
np.linalg.det(a)  # 返回的是矩阵a的行列式
np.linalg.norm(a, ord=None)  # 计算矩阵a的范数
np.linalg.eig(a)  # 矩阵a的特征值和特征向量
np.linalg.cond(a, p=None)  # 矩阵a的条件数
np.linalg.inv(a)  # 矩阵a的逆矩阵

数组运算

from numpy import *

# 数组定义 
a1 = array([1, 1, 1])  # 定义一个数组
a2 = array([2, 2, 2])
a1 + a2  # 对应元素相加,也可以是add(a1, a2)
a1 - a2  # 对应元素相减
a1 * 2  # 对应元素乘一个数->rray([2, 2, 2])

# 乘方 
a1 = array([1, 2, 3])
a1 ** 3  # 表示对数组中的每个数做平方->array([1, 8, 27])

# 定义多维数组 
a3 = array([[1, 2, 3], [4, 5, 6]])
a3[0]  # 取出第一行的数据
a3[0, 0]  # 第一行第一个数据
a3[0][0]  # 也可用这种方式

# 指定数组类型
c = array( [ [1,2], [3,4] ], dtype=complex )

# 矩阵点乘 
a1 = array([1, 2, 3])
a2 = array([4, 5, 6])
a3 = dot(a1, a2)

# 计算列和行和,累计和
a1 = array([
       [ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a2 = a1.sum(axis=0)  # 计算列和
a3 = a1.sum(axis=1)  # 计算行和
a4 = a1.cumsum(axis=1)  # 计算每行累积和,axis=0计算每列累积和
>>>a4 = array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]]) 

# 通用函数
b1 = array([0, 1, 2])
b2 = exp(b1)
b3 = sqrt(b1)
b4 = sin(b1)

索引

from numpy import *

a = arange(10) ** 3
a = arange(10) ** 3  # a = array([0,1,8,27,64,125,216,343,512,729])
a[2]  # = 8
a[2:5]  # = array([8,27,64])
a[:6:2] = -1000  # = array([-1000,1,-1000,27, -1000,125, 216,343,512,729])
a[::-1]  # = array([729,512,343,216,125,-1000,27,-1000,1,-1000]) 反向排序
# 省略点(…)代表许多产生一个完整的索引元组必要的分号
# b[i]中括号中的表达式被当作i和一系列
# :来代表剩下的轴
# x[1,2,…] 等同于 x[1,2,:,:,:],
# x[…,3] 等同于 x[:,:,:,:,3]
# x[4,…,5,:] 等同 x[4,:,:,5,:].

组合

a = array([[ 1.,  1.],
       [ 5.,  8.]])
b = array([[ 3.,  3.],
       [ 6.,  0.]])
c1 = vstack((a,b))  # 合并行
c2 = hstack((a,b))  # 合并列

矩阵和数组的区别

matrix是array的分支,matrix和array在很多时候都是通用的,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快。
matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot()
array的优势就是不仅仅表示二维,还能表示3、4、5…维,而且在大部分Python程序里,array也是更常用的。

在python中,可以使用numpy中array创建一个narray对象,我们可以使用dot(a,b)或者@进行普通矩阵乘法,或者使用multipy(a,b)或者*进行数量积操作。

在python创建一个numpy.array([1,2,3])他是一个行向量,shape = (3,)具体来说退化成一个数组,他是可以看做一个行向量或者列向量,具体要看他是在矩阵乘法的左边还是右边,下面进行测试

参考文献

https://blog.csdn.net/qq_31409555/article/details/51436180

https://blog.csdn.net/taxueguilai1992/article/details/46581861

https://blog.csdn.net/alxe_made/article/details/80492649

https://blog.csdn.net/alxe_made/article/details/80492649

致谢

感谢上述博主的分享!

posted @ 2019-03-13 11:02  hello.world!  阅读(218)  评论(0编辑  收藏  举报