numpy.array 存储多维数组,并可以将这些数组视为矩阵进行操作。在机器学习sklearn框架中,输入数据格式要求使用numpy数组。numpy.array与python基础list和array最大的区别:基础list可以存储任意元素类似R中的vector,缺点就是效率低下;而基础的array虽然做到了仅存储一种元素类型,但是未配备矩阵相关运算。
生成 numpy.array
import numpy as np
nparr = np.array([i for i in range(10)],dtype = int) ## 从list生成 整型numpy.array
nparr.dtype # 检查 numpy 向量中的元素类型
nparr[5] = 3.14 # 对整型的 numpy 数组中传递浮点数会自动转换成整型存储
nparr
生成简单矩阵
np.zeros(shape = (3,5),dtype = int)
### 生成全1矩阵
np.ones(shape = (3,5),dtype = int)
### 生成任意数全填充矩阵
np.full((3,5),fill_value = 8, dtype = int)
生成顺序数
np.arange(0,5,.5) ### 基础功能同python基础的range()函数,扩展支持了小数步长
np.linspace(start = 0,stop = 10, num = 20) ### 从0-10 等距切分成20等分
生成随机数
np.random.seed(666) ### 设定伪随机数的起始种子
np.random.randint(0,10,size = 10) ### 生成10个[0,10)区间的随机整数
np.random.random((3,5)) ### 生成由(0,1)区间浮点数填充的3*5矩阵
np.random.normal(10,2) ### 生成符合均值为10方差2的浮点数
np.random.normal(10,2,(3,5)) ### 生成符合均值为10方差2的浮点数填充的3*5矩阵
矩阵变形
### numpy的reshape()方法 用于数组维度重组
X = np.arange(0,10,step = .5).reshape((4,5))
X.size ### 返回矩阵/数组 对象内全部元素个数
X.shape ### 返回矩阵/数组 的行和列数
拷贝变量副本
### np.array 的copy()方法
# 如果通过 = 的方式来获取子矩阵的切片,python机制中为了节省内存会通过链接的形式来生成子矩阵变量,对子矩阵修改或者对原矩阵修改,两者会一起变化
sub_x = X[:3,:4]
sub_x[0,0] = 200 ### 修改子矩阵第0行0列位置的元素
X[0,0] ### 原矩阵第0行0列位置的元素也变成了在子矩阵修改后的元素
sub_x = X[:3,:4].copy() ### numpy的 copy() 方法会通过复制的形式为子集拓展一块新的内存空间,与原数据集脱离链接。
矩阵拼接
x = np.arange(10).reshape((2,5)) ### 生成一个二维矩阵,x.ndim 为2
y = np.random.random(5) ### 生成一个一维向量,y.ndim 为1
np.concatenate([x,x]) ### 按行拼接矩阵
np.concatenate([x,x],axis = 1) ### 按列拼接
np.concatenate([x,y.reshape(1,-1)]) ### 用concatenate方法将二维数据与一维数据按行拼接需要将一维向量结构转换成二维向量
np.vstack([x,y]) ### 用vstack 方法按行拼接将更加智能,类似R中的rbind()
np.hstack([x,x]) ### 类似R中的cbind()
数据分割
y = np.arange(0,10,1)
np.split(y,[3,7]) ### 以3和7为分割点切分数组
np.vsplit(x,[1]) ### 按第1行的位置分割矩阵
np.hsplit(x,[2,4]) ### 按第2,4列的位置分割矩阵
np.hsplit(x,[-1])[1] ### 按获取矩阵的最后一列
一般数学运算(Universal Function)
X = np.arange(24).reshape(4,6)
X + 1
X * 2 # 数乘
X / 2 # 浮点数除法
X // 2 # 整除
X ** 2 # 元素乘方
X % 2 # 元素取余
1 / 2 # 取倒数
np.abs(X) # 取绝对值
#np.log(X) # 以e为底取自然对数
#np.log2(X)
#np.log10(X)
A = np.arange(4).reshape(2,2)
B = np.full((2,2),10)
v = np.array([1,2])
A + B # 矩阵加法
A.dot(B) # 矩乘
A.T # 调用转置属性
v + A # 向量与矩阵的加法运算,该计算自动将向量扩展成与矩阵相同的形状
v.dot(A) # 向量与矩阵的乘法,对于2*2的矩阵A,左乘v向量按 1*2 的形式组织
A.dot(v) # 向量与矩阵的乘法,对于2*2的矩阵A,右乘v向量按 2*1 的形式组织
np.linalg.inv(A) # 取矩阵的逆
np.linalg.inv(A).dot(A) # 矩阵的逆与矩阵相乘得到单位矩阵I,方阵才有逆
np.linalg.pinv(X) # 长方阵没有逆,但可以取伪逆
聚合统计
### numpy.array 聚合运算(统计)
np.sum(v) ### 向量所有元素求和
np.var(v) ### 取方差
np.std(v) ### 取标准差
np.min(v) ### 取最小的元素
np.argmin(v) ### 获取数组中最小值的索引位
np.mean(v) ### 取均值
np.median(v) ### 取中位数,中位数相比均值,一定程度上能消除异常值对群体均值的干扰作用
np.percentile(v,q = 50) ### 取0.5分位数,一般我们关注分位点的q参数为 0,25,50,75,100
np.sum(X,axis = 0) ### 矩阵列方向求和
np.sum(X,axis = 1) ### 矩阵行方向求和
np.count_nonzero( v < 3) ### 统计向量中小于3的非零元素个数
np.any(v == 3) ### 查找向量中是否有等于3的元素
np.all(v == 3) ### 查找向量中是否所有元素都等于3
np.sum( v % 2 == 0)### 查找向量中有多少个偶数
np.sum( X % 2 == 0,axis = 1)### 沿着列方向-->,查找每行有多少偶数
np.sum( X % 2 == 0,axis = 0)### 沿着行方向(向下),查找每列有多少偶数
排序
v = np.arange(10)
np.random.shuffle(v) # 乱序处理数组中的元素
v.sort() # 向量元素排序
np.sort(X) #对矩阵中的每个行向量内的所有元素进行排序
np.sort(X,axis = 1) #对矩阵中的每个列向量内的所有元素进行排序
np.argsort(v) # 返回排序完成后向量内元素的索引
np.partition(v,3) #以3为标定点,将小于3的放在数组左侧,大于3的放在数组右侧
数据索引(Fancy Indexing)
v[[3,5,8]] ### 索引向量中的3,5,8号位元素
X[[0,1,1],[2,3,3]] ### 索引矩阵中的[0,2],[1,3],[1,3]号位元素
比较运算符
### numpy.array 比较运算符
### 逻辑运算符
np.sum((v>3)&(v<10)) ### 且
np.sum((v % 2 == 0)| (v > 10)) ### 或
np.sum(~(v == 0 )) ### 非
numpy的优势主要应用于向量矩阵的操作,但对于表格形式的数据组织处理方式则多使用Pandas包的系列函数进行数据预处理,然后转成numpy格式作为进一步输入。
网友评论