NumPy库极大地简化了向量和矩阵的操作和处理,在Python 生态系统中广泛用于数据分析、机器学习和科学计算。一些主流的流行包也依赖 NumPy 包括 scikit-learn、SciPy、pandas 和 tensorflow)。
这里用图例介绍NumPy的一些主要用法,以及它如何表示不同类型的数据(表格、图像、文本等),然后才能将它们提供给机器学习模型。
一、生成一个数组
1.1 分配对象
import numpy as np
data = np.array([1,2,3])
print(data)
data2 = np.array([[1,2],[3,4]])
print(data2)
1.2 初始化
import numpy as np
# 1-D array
print(np.ones(3))
print(np.zeros(3))
print(np.random.random(3))
# 2-D array, 注意这里是"(3,2)", 不是"3,2"
print(np.ones((3,2)))
print(np.zeros((3,2)))
print(np.random.random((3,2)))
二、数组运算
2.1 数组加减乘除
import numpy as np
print(np.array([1,2]) + np.ones(2))
print(np.array([1,2]) - np.ones(2))
print(np.array([1,2]) * np.ones(2))
print(np.array([1,2]) / np.ones(2))
# 也可以这样写
print(np.array([1,2]) + 1)
print(np.array([1,2]) - 1)
print(np.array([1,2]) * 1.6)
print(np.array([1,2]) / 1)
NumPy 把每个单元格进行运算称为广播。
2.2索引/切片
import numpy as np
data = np.array([1,2,3])
print(data)
print(data[0])
print(data[1])
print(data[0:2])
print(data[1:])
2.2 聚合
import numpy as np
data = np.array([1,2,3])
print(data)
print(data.max())
print(data.min())
print(data.sum())
print(data.mean()) #平均值
print(data.prod()) #所有数相乘
print(data.std()) #标准差
#还有更多运算函数...
2.3 矩阵运算
仅当不同维度为一时(矩阵只有一列或一行),我们才可以对不同大小的矩阵进行这些算术运算,在这种情况下,NumPy 使用其广播规则进行该运算。
import numpy as np
data = np.array([[1,2],[3,4]])
data2 = np.ones((2,2))
print(data + data2)
# data3 为一维数组,这种行为也称为运算broadcast
data3 = np.ones(2)
print(data + data3)
相同矩阵相加
运算扩散图示:
点积:
NumPy 提供了dot()
方法对矩阵进行点积运算:
import numpy as np
data = np.array([1,2,3])
powers_of_ten = np.array([[1,10],[100,1000],[10000,100000]])
print(data.dot(powers_of_ten))
2.4 矩阵索引
import numpy as np
data = np.array([[1,2],[3,4],[5,6]])
print(data)
print(data[0,1])
print(data[1:3])
print(data[0:2,0])
2.5 矩阵聚合
import numpy as np
data = np.array([[1,2],[3,4],[5,6]])
print(data)
print(data.max())
print(data.min())
print(data.sum())
我们不仅可以聚合矩阵中的所有值,还可以使用参数跨行或列进行聚合axis
:
import numpy as np
data = np.array([[1,2],[3,4],[5,6]])
print(data)
print(data.max(axis=0))
print(data.max(axis=1))
2.6 矩阵转置
import numpy as np
data = np.array([[1,2],[3,4],[5,6]])
print(data)
print(data.T)
2.7 矩阵的维度重建
数据集合是一样的,但是想改变矩阵的维度。在机器学习应用程序中经常出现这种情况,其中某个模型期望输入的形状与数据集不同。NumPy 的reshape()
方法在,只需将所需的矩阵新维度传递给它即可。NumPy 可以根据矩阵推断出正确的维度。
import numpy as np
data = np.array([1,2,3,4,5,6])
print(data)
print(data.reshape(2,3))
print(data.reshape(3,2))
三、数学公式实战
我们要对这个数学公式用numpy表达
那么可以降解成数组predictions和数组labes的一些数学运算。从里面的数组减-> 平方square -> 求和sum -> 数组乘broadcast。
import numpy as np
predictions = np.array([1,1,1])
labels = np.array([1,2,3])
print(predictions - labels)
print(np.square(predictions - labels))
print(np.sum(np.square(predictions - labels)))
print((1/3) * np.sum(np.square(predictions - labels)))
四、numpy的一些应用
4.1 表格和电子表格
- Excel表格是二维矩阵。另外很多库比如panda的dataframe也使用 NumPy构建。
4.2 多媒体的数字化
4.2.1 音频和时间序列
- 声音通过采样变成一维数组的音频文件。达到CD音质的音频每秒可能有 44,100 个样本,每个样本是 -32767 到 32768 之间的整数。如果有一个10 秒 WAVE 文件,加载到Numpy就是长度为 10 * 44,100数组= 441,000 个样本。想要提取音频的第一秒,只需将文件加载到我们将调用的 NumPy 数组中
audio
,然后获取audio[:44100]
。
下面是音频文件的一个片段:
4.2.2 图片
- 图像是大小(高 x 宽)像素的矩阵。
- 如果图像是黑白的(也称为灰度),则每个像素可以用单个数字表示(通常在 0(黑色)和 255(白色)之间)。想要裁剪图像左上角 10 x 10 像素部分,只需用NumPy 来找
image[:10,:10]
。
下面是图像文件的一部分:
- 如果图像是彩色的,则每个像素由三个数字表示 - 红色、绿色和蓝色各一个值。在这种情况下,我们需要一个第三维(因为每个单元格只能包含一个数字)。因此,彩色图像由尺寸为(高 x 宽 x 3)的 ndarray 表示。
4.2.3 语言
如果我们处理文本,情况就会有所不同。文本的数字表示需要构建词汇表(模型知道的所有唯一单词的清单)和word2vec。词汇表举例
然后可以将句子分解为标记数组:
然后我们用词汇表中的 id 替换每个单词:
这些 ID 仍然无法为模型提供太多信息价值。因此,在将单词序列输入模型之前,需要用它们的嵌入替换标记/单词(在本例中为 50维的word2vec):
这个 NumPy 数组的维度为 [embedding_dimension x sequence_length]。出于性能原因,深度学习模型倾向于保留批量大小的第一个维度(因为如果并行训练多个示例,则可以更快地训练模型)。reshape()
这是一个非常有用的明显案例。例如BERT这样的模型期望其输入的形状为:[batch_size,sequence_length,embedding_size]。
现在,这是一个模型以供模型训练(或预测)。