diff --git a/Python/numpy/1概述.md b/Python/numpy/1概述.md index 6003de1f..b487cb6c 100644 --- a/Python/numpy/1概述.md +++ b/Python/numpy/1概述.md @@ -12,7 +12,7 @@ ## 关系 * 可以使用向量,来定义n维线性空间、n维向量空间。向量,以数学的方式描述n维线性空间。标量、向量、矩阵、张量是对n维线性空间的暴力展开。 * 维数:数组总共有多少个维度。3维 -* 维度:数组每个维度是多少。维度是(2,3,4) +* 维度:数组每个维的长度是多少。维度是(2,3,4) * 范数:用来衡量数组的特征。F1范数,绝对值之和。F2范数,平方和。 * 列表和张量不同。列表的低维的维度可以不同。[[1],[1,2]]。张量,相同维的维度必须一致。 * 对于张量的描述可以使三阶,一阶二维,二阶三维,三阶四维。 @@ -28,4 +28,18 @@ * 不同维度的四则运算,进行广播。 * 点乘,同维度,同位置相乘相加。 -点乘,不同维度, \ No newline at end of file +点乘,不同维度, + +## 维度说明 +ndarray(多维数组)是Numpy处理的数据类型。多维数组的维度即为对应数据所在的空间维度,1维可以理解为直线空间,2维可以理解为平面空间,3维可以理解为立方体空间。 + +![](image/2022-01-18-14-52-13.png) + +* 轴是用来对多维数组所在空间进行定义、描述的一组正交化的直线,根据数学惯例可以用i,j,ki, j ,ki,j,k来表示。 + +* 在一维空间中,用一个轴就可以表示清楚,numpy中规定为axis 0,空间内的数可以理解为直线空间上的离散点 (x i, )。 +* 在二维空间中,需要用两个轴表示,numpy中规定为axis 0和axis 1,空间内的数可以理解为平面空间上的离散点(x i,y j)。 +* 在三维空间中,需要用三个轴才能表示清楚,在二维空间的基础上numpy中又增加了axis 2,空间内的数可以理解为立方体空间上的离散点(x i,y j,z k)。 + +> Python中可以用numpy中的ndim和shape来分别查看维度,以及在对应维度上的长度。直观上可以根据符号“[ ]”的层数来判断,有m层即为m维,最外面1层对应axis0, 依次为axis1,axis2… + diff --git a/Python/numpy/7数组操作.md b/Python/numpy/7数组操作.md index e5084069..1224190a 100644 --- a/Python/numpy/7数组操作.md +++ b/Python/numpy/7数组操作.md @@ -40,7 +40,7 @@ [expand_dims](https://numpy.org/devdocs/reference/generated/numpy.expand_dims.html#numpy.expand_dims)(a, axis) | 扩展数组的形状。 [squeeze](https://numpy.org/devdocs/reference/generated/numpy.squeeze.html#numpy.squeeze)(a[, axis]) | 从数组形状中删除一维条目。 -## 改变数组的种类 +## 改变种类 方法 | 描述 ---|--- @@ -104,3 +104,241 @@ [reshape](https://numpy.org/devdocs/reference/generated/numpy.reshape.html#numpy.reshape)(a, newshape[, order]) | 在不更改数据的情况下为数组赋予新的形状。 [roll](https://numpy.org/devdocs/reference/generated/numpy.roll.html#numpy.roll)(a, shift[, axis]) | 沿给定轴滚动数组元素。 [rot90](https://numpy.org/devdocs/reference/generated/numpy.rot90.html#numpy.rot90)(m[, k, axes]) | 在轴指定的平面中将阵列旋转90度。 + + + +## 数组拼接(博客) + +> [参考文献](https://www.jb51.net/article/161997.htm) + + +| concatenate | 提供了axis参数,用于指定拼接方向 | +|--------------|---------------------------| +| append | 默认先ravel再拼接成一维数组,也可指定axis | +| stack | 提供了axis参数,用于生成新的维度 | +| hstack | 水平拼接,沿着行的方向,对列进行拼接 | +| vstack | 垂直拼接,沿着列的方向,对行进行拼接 | +| dstack | 沿着第三个轴(深度方向)进行拼接 | +| column_stack | 水平拼接,沿着行的方向,对列进行拼接 | +| row_stack | 垂直拼接,沿着列的方向,对行进行拼接 | +| r_ | 垂直拼接,沿着列的方向,对行进行拼接 | +| c_ | 水平拼接,沿着行的方向,对列进行拼接 | + + +### 0. 维度和轴 + +在正确理解Numpy中的数组拼接、合并操作之前,有必要认识下维度和轴的概念: +ndarray(多维数组)是Numpy处理的数据类型。多维数组的维度即为对应数据所在的空间维度,1维可以理解为直线空间,2维可以理解为平面空间,3维可以理解为立方体空间。 + +![](image/2022-01-18-15-09-49.png) + +轴是用来对多维数组所在空间进行定义、描述的一组正交化的直线,根据数学惯例可以用i,j,ki, j ,ki,j,k来表示。 +* 在一维空间中,用一个轴就可以表示清楚,numpy中规定为axis 0,空间内的数可以理解为直线空间上的离散点 (x iii, )。 +* 在二维空间中,需要用两个轴表示,numpy中规定为axis 0和axis 1,空间内的数可以理解为平面空间上的离散点(x iii,y jjj)。 +* 在三维空间中,需要用三个轴才能表示清楚,在二维空间的基础上numpy中又增加了axis 2,空间内的数可以理解为立方体空间上的离散点(x iii,y jjj,z kkk)。 + +Python中可以用numpy中的ndim和shape来分别查看维度,以及在对应维度上的长度。直观上可以根据符号“[ ]”的层数来判断,有m层即为m维,最外面1层对应axis0, 依次为axis1,axis2… + +```py +>>> a = np.array([1,2,3]) +>>> a.ndim # 一维数组 +1 +>>> a.shape # 在这个维度上的长度为3 +(3,) + +>>> b = np.array([[1,2,3], [4,5,6]]) +>>> b.ndim # 二维数组 +2 +>>> b.shape # 在axis 0 上的长度为2, 在axis 1上的长度为3.或者可以感性的理解为2行3列 +(2, 3) + +>>> c = np.array([[[1,2,3], [4,5,6]]]) +>>> c.ndim # 三维数组 +3 +>>> c.shape # 在axis 0 上的长度为1,在axis 1上的长度为2, 在axis 2上的长度为3. 或者可以感性的理解为1层2行3列 +(1, 2, 3) +``` + + +### 1. np.concatenate() + +```py +concatenate(a_tuple, axis=0, out=None) +""" +参数说明: +a_tuple:对需要合并的数组用元组的形式给出 +axis: 沿指定的轴进行拼接,默认0,即第一个轴 +""" +``` +示例 + +``` +>>> import numpy as np +>>> ar1 = np.array([[1,2,3], [4,5,6]]) +>>> ar2 = np.array([[7,8,9], [11,12,13]]) +>>> ar1 +array([[1, 2, 3], + [4, 5, 6]]) +>>> ar2 +array([[ 7, 8, 9], + [11, 12, 13]]) + +>>> np.concatenate((ar1, ar2)) # 这里的第一轴(axis 0)是行方向 +array([[ 1, 2, 3], + [ 4, 5, 6], + [ 7, 8, 9], + [11, 12, 13]]) + +>>> np.concatenate((ar1, ar2),axis=1) # 这里沿第二个轴,即列方向进行拼接 +array([[ 1, 2, 3, 7, 8, 9], + [ 4, 5, 6, 11, 12, 13]]) + +>>> ar3 = np.array([[14,15,16]]) # shape为(1,3)的2维数组 +>>> np.concatenate((ar1, ar3)) # 一般进行concatenate操作的array的shape需要一致,当然如果array在拼接axis方向的size不一样,也可以完成 +>>> np.concatenate((ar1, ar3)) # ar3虽然在axis0方向的长度不一致,但axis1方向上一致,所以沿axis0可以拼接 +array([[ 1, 2, 3], + [ 4, 5, 6], + [14, 15, 16]]) +>>> np.concatenate((ar1, ar3), axis=1) # ar3和ar1在axis0方向的长度不一致,所以报错 +``` + + +### 2. np.append() + +```py +append(arr, values, axis=None) +""" +参数说明: +arr:array_like的数据 +values: array_like的数据,若axis为None,则先将arr和values进行ravel扁平化,再拼接;否则values应当与arr的shape一致,或至多 + 在拼接axis的方向不一致 +axis:进行append操作的axis的方向,默认无 +""" +``` +示例 + +```py +>>> np.append(ar1, ar2) # 先ravel扁平化再拼接,所以返回值为一个1维数组 +array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13]) + +>>> np.append(ar1, ar2, axis=0) # 沿第一个轴拼接,这里为行的方向 +array([[ 1, 2, 3], + [ 4, 5, 6], + [ 7, 8, 9], + [11, 12, 13]]) + +>>> np.append(ar1, ar2, axis=1) # 沿第二个轴拼接,这里为列的方向 +array([[ 1, 2, 3, 7, 8, 9], + [ 4, 5, 6, 11, 12, 13]]) +Python客栈送红包、纸质书 +``` + +### 3. np.stack() + +```py +stack(arrays, axis=0, out=None) +""" +沿着指定的axis对arrays(每个array的shape必须一样)进行拼接,返回值的维度比原arrays的维度高1 +axis:默认为0,即第一个轴,若为-1即为第二个轴 +""" +``` +示例 + +``` +>>> np.stack((ar1, ar2)) # 增加第一个维度(axis0,之后的axis向后顺延:0—>1, 1—>2) +array([[[ 1, 2, 3], + [ 4, 5, 6]], + [[ 7, 8, 9], + [11, 12, 13]]]) + +>>> np.stack((ar1, ar2), axis=1) # 增加第二个维度(axis1,之后的axis向后顺延, 1—>2) +array([[[ 1, 2, 3], + [ 7, 8, 9]], + [[ 4, 5, 6], + [11, 12, 13]]]) + +>>> np.stack((ar1, ar2), axis=2) # 增加第三个维度(axis2,和axis=-1的效果一样,原来的axis0和axis1保持不变) +array([[[ 1, 7], + [ 2, 8], + [ 3, 9]], + [[ 4, 11], + [ 5, 12], + [ 6, 13]]]) +``` +关于维度增加的一种理解方式 + + +![](image/2022-01-18-15-12-33.png) + +### 4. hstack、vstack和vstack + +```py +>>> np.hstack((ar1,ar2)) # 水平拼接,沿着行的方向,对列进行拼接 +array([[ 1, 2, 3, 7, 8, 9], + [ 4, 5, 6, 11, 12, 13]]) + +>>> np.vstack((ar1,ar2)) # 垂直拼接,沿着列的方向,对行进行拼接 +array([[ 1, 2, 3], + [ 4, 5, 6], + [ 7, 8, 9], + [11, 12, 13]]) + +>>> np.dstack((ar1,ar2)) # 对于2维数组来说,沿着第三轴(深度方向)进行拼接, 效果相当于stack(axis=-1) +array([[[ 1, 7], + [ 2, 8], + [ 3, 9]], + [[ 4, 11], + [ 5, 12], + [ 6, 13]]]) +``` +### 5. column_stack和row_stack + +```py +>>> np.column_stack((ar1,ar2)) # 水平拼接,沿着行的方向,对列进行拼接 +array([[ 1, 2, 3, 7, 8, 9], + [ 4, 5, 6, 11, 12, 13]]) + +>>> np.row_stack((ar1,ar2)) # 垂直拼接,沿着列的方向,对行进行拼接 +array([[ 1, 2, 3], + [ 4, 5, 6], + [ 7, 8, 9], + [11, 12, 13]]) +``` + +### 6. np.r_ 和np.c_ + +常用于快速生成ndarray数据 + +``` +>>> np.r_[ar1,ar2] # 垂直拼接,沿着列的方向,对行进行拼接 +array([[ 1, 2, 3], + [ 4, 5, 6], + [ 7, 8, 9], + [11, 12, 13]]) + +>>> np.c_[ar1,ar2] # 水平拼接,沿着行的方向,对列进行拼接 +array([[ 1, 2, 3, 7, 8, 9], + [ 4, 5, 6, 11, 12, 13]]) +``` +### 7. 总结 + +对于两个shape一样的二维array来说: + +增加行(对行进行拼接)的方法有: + +```py +np.concatenate((ar1, ar2),axis=0) +np.append(ar1, ar2, axis=0) +np.vstack((ar1,ar2)) +np.row_stack((ar1,ar2)) +np.r_[ar1,ar2] +``` +增加列(对列进行拼接)的方法有: + +```py +np.concatenate((ar1, ar2),axis=1) +np.append(ar1, ar2, axis=1) +np.hstack((ar1,ar2)) +np.column_stack((ar1,ar2)) +np.c_[ar1,ar2] +``` \ No newline at end of file diff --git a/Python/numpy/image/2022-01-18-14-52-13.png b/Python/numpy/image/2022-01-18-14-52-13.png new file mode 100644 index 00000000..b39929e0 Binary files /dev/null and b/Python/numpy/image/2022-01-18-14-52-13.png differ diff --git a/Python/numpy/image/2022-01-18-15-09-49.png b/Python/numpy/image/2022-01-18-15-09-49.png new file mode 100644 index 00000000..b39929e0 Binary files /dev/null and b/Python/numpy/image/2022-01-18-15-09-49.png differ diff --git a/Python/numpy/image/2022-01-18-15-12-33.png b/Python/numpy/image/2022-01-18-15-12-33.png new file mode 100644 index 00000000..683b5e06 Binary files /dev/null and b/Python/numpy/image/2022-01-18-15-12-33.png differ diff --git a/Sklearn/sklearn-cookbook-zh/1 模型预处理.md b/Sklearn/sklearn-cookbook-zh/1 模型预处理.md index 719c6a20..37a2e694 100644 --- a/Sklearn/sklearn-cookbook-zh/1 模型预处理.md +++ b/Sklearn/sklearn-cookbook-zh/1 模型预处理.md @@ -1465,19 +1465,18 @@ iris_pca[:5] - - array([[ -2.68420713e+00, -3.26607315e-01, 2.15118370e-02, - 1.00615724e-03], - [ -2.71539062e+00, 1.69556848e-01, 2.03521425e-01, - 9.96024240e-02], - [ -2.88981954e+00, 1.37345610e-01, -2.47092410e-02, - 1.93045428e-02], - [ -2.74643720e+00, 3.11124316e-01, -3.76719753e-02, - -7.59552741e-02], - [ -2.72859298e+00, -3.33924564e-01, -9.62296998e-02, - -6.31287327e-02]]) - - +``` +array([[ -2.68420713e+00, -3.26607315e-01, 2.15118370e-02, + 1.00615724e-03], + [ -2.71539062e+00, 1.69556848e-01, 2.03521425e-01, + 9.96024240e-02], + [ -2.88981954e+00, 1.37345610e-01, -2.47092410e-02, + 1.93045428e-02], + [ -2.74643720e+00, 3.11124316e-01, -3.76719753e-02, + -7.59552741e-02], + [ -2.72859298e+00, -3.33924564e-01, -9.62296998e-02, + -6.31287327e-02]]) +``` 这样PCA就完成了,我们可以看看降维的效果: diff --git a/工作日志/2022年1月18日-今日计划.md b/工作日志/2022年1月18日-今日计划.md new file mode 100644 index 00000000..d580a1d2 --- /dev/null +++ b/工作日志/2022年1月18日-今日计划.md @@ -0,0 +1,17 @@ +## 任务、工作栈 + +### 关于特征工程 +- [x] 学习numpy的数据处理 +- [ ] 学习sklearn的数据分析方法 +- [ ] 对权限特征进行分析,找到80%重要权限。 +- [ ] 对intentfilter特征进行初步过滤android.intentfilter +- [ ] 对intentfilter特征进行数据分析 +- [ ] 找到80的intentfilter特征 +- [ ] api已经不需要过滤了。直接分析,找到重要的30%的特征 +- [ ] hardware需要根据android.hardware进行过滤 +- [ ] 对hardware进行数据统计分析 +- [ ] url特征暂时全都舍弃掉,我觉得url网址主要作为一种外部特征,应该在恶意软件家族分类的时候非常有用。 + +### 后续神经网络 + +再想想把,争取在这一周都完成。 \ No newline at end of file