Python使用NumPy包完成了对N维数组的快速便捷操作. SciPy包以NumPy包为基础, 扩展了numpy的能力.
SciPy在最外层命名空间中包括了所有的NumPy内容,使用时仅需import scipy, 而不必再单独 import numpy.
numpy的基本类型是数组(array), 矩阵(maxtix)类为array的子类, 继承了其一切特性.
import numpy as np
I 数组创建
1.1 直接创建(np.array)
建立一个一维数组:
a1 = np.array([1,2,3])
建立一个二维数组:
a2 = np.array([1,2,3],[4,5,6])
将列表转换为数组
b = [[1, 2, 3],[4, 5, 6]]
a3 = np.array(b)
数组类型只支持一种数据类型的存储, 当混合多种数据类型创建数组时, 将自动转换为元素中最高级别类型. 类型级别排序如下:
整数<浮点数<字符串
1.2 特殊矩阵创建
此处使用矩阵的说法但通过下列函数创建的对象其数据类型仍未array, 使用矩阵名称因为称呼方便
创建一个2行3列(2*3)全为0矩阵:(参数是一个tuple 因此有两个括号)
b1 = np.zeros((2,3))
# 参数是一个tuple 因此有两个括号
创建一个3*4使用随机数填充的矩阵
b2 = empty((3,4))
创建一个n阶单位方阵:
b2 = np.identity(n)
# 只能创建二位数组
创建一个n阶对角线为1的矩阵 k用于指示对角线位置,可省略
b3 = np.eye(n,k=0)
like系列
通过已知矩阵的行列数创建指定类型矩阵:
zeros_like(A)
empty_like(A)
ones_like(A)
1.3 数组创建
1.3.1 按步长
范围皆为左闭右开(起点, 终点(不包括), 步长), 大体同range()
c1 = arrange(2, 3, 0.1)
c2 = arrange(8) # 类似range(8)
1.3.2 按点数
c3 = linspace(1, 4, 10) # 线性空间
c4 = logspace(2, 5, 8) # 对数空间
II 数组运算
2.1 四则运算和叉乘
直接使用“+-*/”为按元素运算, 使用“@”进行叉乘运算
也可使用np.dot(A,B)
计算点乘, np.vdot()
使用向量方式处理复数
2.2 转置
任意维数组后添加.T
实现转置:
A.T
对于二维数组, 转置操作和数学上的转置作用相同, 而对一维数组施加转置将没有任何效果.
Numpy中的转置可以理解为将shape属性向右循环右移一位(显然仅做此操作数组元素的整体位置不会发生变化, 此处为方便理解), 二位数组的shape属性有两个值, 因此转置操作可体现为行列互换; 而一维数组shape属性仅有一个值, 因此对其不产生影响. 此机理是为协调对高维数组仍可进行转置操作.
2.3 其他数学运算
求矩阵的迹:
A.trace()
求矩阵的行列式:
np.linalg.det(A)
计算矩阵的特征值和特征相量:
np.linalg.eig(A)
矩阵求逆:
np.linalg.inv(A)
取共轭矩阵
A.conj()
矩阵循环移位:
np.roll(A,2) # 矩阵A向右移动两位
III 数组索引
NumPy中数组的索引形式和Python一致
A.shape=(2, 2, 5) # 重新赋值shape属性 元素个数应相同
A.reshape(2, 10) # 返回一个改变了维度/形状的矩阵
A.flatten() # 返回一个展平矩阵后的数组
IV 数组的属性
返回数组的存储情况:
A.flags
返回数组的行列数:
A.shape # 返回结果为一tuple
返回矩阵维数:
A.ndim
返回矩阵中元素数量:
A.size
返回矩阵所占内存:
A.itemsize
返回矩阵类型:
A.dtype
V 数组拓展
5.1 append
ab矩阵都被展平后连接(得到一个1维数组):
c1 = np.append(a,b)
保持形状连接:
c2 = np.append(a,b,axis=0) # 纵向连接
c3 = np.append(a,b,axis=1) # 横向连接
5.2 stack
stack方法皆需要元组参数
直接拼接:
该方法需要两个shape相同的数组, 拼接得到一个更高维数组
d1 = np.stack((a,b))
[in]
a=[1 2]
b=[3 4]
[out]
d1=[[1 2] [3 4]]
纵向连接:
d2 = np.vstack((a,b)) # 类似np.append(a,b,axis=0)
横向连接:
d3 = np.hstack((a,b)) # 类似np.append(a,b,axis=1)
交错连接:
d4 = np.dstack((a,b))
[in]
a=[1 2 3 4]
b=[5 6 7 8]
[out]
d4 =
[[1 2]
[3 4]
[5 6]
[7 8]]
VI 格式转换
数据, 矩阵, 列表这三种数据类型可相互转换
转换为数组:
np.array(A)
转换为矩阵:
np.mat(B)
转换为列表:
array1.tolist()
matrix1.tolist()
分解至列表:
使用此方法数据/矩阵将分解为数个小数组/矩阵存储至列表
list(C)
附
A 数组和矩阵的区别
numpy array(ndarrys)可以为任意维, numpy matrices必须是2维. Matrix是Array的分支, 因此包含其全部特性.
1 | a = np.mat([[4,3],[2,1]]) # 创建Matrix |
两者都能通过.T取得转置, 而Matrix可以通过.I得到逆矩阵, 此外Matrix使用”*”表示叉乘(显然此特性可能让程序混乱).
两者相互转换:
1 | B = np.asmatrix(A) |
B 数组和列表的区别
1.创建方式不同
list(列表)是python的基本数据类型,直接使用[]即可创建
ndarray(数组)是NumPy库中的函数,只能存储单一数据类型,创建时需要引入NumPy库
1 | import numpy as np |
2.存储对象不同
列表可以存储任何对象,数组只能存储单一数据类型
3.运算方式不同
数据可以按对应元素进行四则运算,列表只能进行拼接操作
4.存储效率不同
array为了精确便捷处理庞大数据产生,其数据处理效率远大于list