机器学习2-1:Numpy机器学习基础超易懂介绍!
机器学习2-1:Numpy机器学习基础超易懂介绍!
Numpy是什么?
Numpy是一个便于进行多维度数组运算的Python工具包。在机器学习领域,特别是在使用sklearn框架时,数据的输入输出和预处理通常都依赖于Numpy的多维数组。
例如,下面的代码展示了如何使用Numpy数组作为输入数据训练一个模型:
从上到下观察被选中的部分可以发现,这段代码首先引入了numpy,然后创建了numpy数组X,Y。随后,数据X,Y被喂给了一个模型(clf),最后调用模型进行了预测并输出了结果。
Numpy基础入门
作为一个工具,我们不需要掌握Numpy的所有细节,只需要了解一些核心概念和常用操作即可。
创建数组
创建数组在Numpy中有很多种方法,但估计除了今天,你以后都不会再创建了。我们进入正式学习机器学习之后,数据一般都是直接引用sklearn的数据,或者到网上的机器学习平台下载一些开源数据。
一维数组
使用 np.array()
创建一个一维数组:
a = np.array([1, 2])
print(a)
输出:
[1 2]
三维数组
创建一个三维数组:
data1=[1,2,3,4,5]
data2=[6,7,8,9,10]
data3=[11,12,13,14,15]
data4=[16,17,18,19,20]
data5=[21,22,23,24,25]
data6=[26,27,28,29,30]
data=np.array([[data1,data2,data3],[data4,data5,data6],[data3,data2,data1]])
print(data)
输出:
[[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
[[16 17 18 19 20]
[21 22 23 24 25]
[26 27 28 29 30]]
[[11 12 13 14 15]
[ 6 7 8 9 10]
[ 1 2 3 4 5]]]
数组属性
每个Numpy数组(ndarray)都有一些属性,常用的有以下四个:
div_3_array = np.ones(shape=(3, 3, 3))
print(div_3_array.ndim) # 维度
print(div_3_array.shape) # 结构
print(div_3_array.size) # 元素数量
print(div_3_array.dtype) # 元素类型
输出:
3
(3, 3, 3)
27
float64
数组操作
变形
变形就是改变数组的形状。例如,将一个333的数组变形为3*9的二维数组:
rs_div_3=div_3_array.reshape((3,9))
print(rs_div_3.shape)
print(rs_div_3)
输出:
[[1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1.]]
注意,形变前后,两个数组的元素个数应该一样。
切块
在进行切块之前,需要理解数组的坐标轴概念。在NumPy中,数组的“轴”指的是数组的维度。例如,一个二维数组可以有两个轴:第一个轴是行,第二个轴是列。
- 轴 0(第一个轴)通常表示“行”方向。
- 轴 1(第二个轴)表示“列”方向。
对于更高维的数组:
- 轴 2 可能表示更深的维度(比如一个三维数组的“深度”方向)。
- 轴 3 可能表示更高层次的维度(四维数组,类似时间序列的数据等)。
基于这个轴的概念,我们可以对Numpy数组进行切块操作。切块时使用的索引叫切片索引,特点是包含冒号。例如:
print(div_1_array[0:2])
需要注意的是,Numpy的数组索引是左闭右开的。例如:
div_1_array = np.arange(1, 3, 1)
print(div_1_array)
print(div_1_array[0:2])
输出:
[1 2 3 4]
[1 2]
运行一下分块:
print(div_1_array[0:3])
输出:
[1 2 3]
按照我们学过的数组的索引,四个数字的编号应该是0,1,2,3,所以 print(div_1_array[0:3])
应该输出全部数字才对。但在Numpy的索引机制里,就是左闭右开的。这样的设计主要是为了和Python的列表等保持一致。这样也有好处,就是容易计算元素个数,在上面的代码中,切片索引的 3-0=3
,就是输出的 [1,2,3]
的元素的个数。
堆叠
在NumPy中,堆叠是将多个数组沿不同的轴组合成一个新的数组。NumPy提供了几种堆叠函数,主要包括:
np.stack()
:沿新的轴堆叠数组。np.concatenate()
:沿现有的轴拼接数组。np.hstack()
:水平堆叠数组(即按列拼接)。np.vstack()
:垂直堆叠数组(即按行拼接)。np.dstack()
:深度堆叠数组(即沿第三维拼接)。
例如,使用 np.stack()
沿着新的轴堆叠数组:
import numpy as np
a = np.array([1, 2])
b = np.array([3, 4])
c = np.array([5, 6])
# 沿着新的轴(轴 0)堆叠
stacked = np.stack((a, b, c), axis=0)
print(stacked)
输出:
[[1 2]
[3 4]
[5 6]]
你也可以改变轴(axis=1)来改变堆叠方向:
# 沿着轴 1 堆叠
stacked = np.stack((a, b, c), axis=1)
print(stacked)
输出:
[[1 3 5]
[2 4 6]]
保存
有的时候我们会把训练数据,测试数据进行保存,以便用在其他模型上。这是后可以将其保存的numpy的数组文件 .npy
中。
np.save('X_train_1div.npy', X_train)
要导入时:
X_train_loaded = np.load('X_train_1div.npy')
这只是一个Numpy的入门,但也够我们用一阵子了。以后需要深入的时候,再去看看Numpy的文档就差不多了。