NumPy(Numerical Python)是Python科学计算的基础包,极大地简化了向量和矩阵的操作处理。
1 创建Numpy对象
Numpy最重要的就是其N NN维数组对象ndarray,它是一个通用的同构数据多维容器,其中的所有元素必须是相同类型。每个数组都有一个shape(表示各维度大小)和一个dtype(表示数据数据类型)。
(1) np.array
使用 np.array
创建 NumPy 数组,它接受一切序列型的对象,如python列表等。
嵌套序列(等长列表组成的列表)将会被转换为一个多维数组。
更多维度:
import numpy as np data1 = [1,2,3,4,5] arr1 = np.array(data1) data2 = [[1,2,3,4],[5,6,7,8]] arr2 = np.array(data2) print(data1) print(data2)
(2)其他创建函数
arange
:相当于内置的range
,返回一个ndarray对象,常与reshape
搭配产生给定形状数组。ones
/ones_like
:根据指定形状和dtype创建一个全1数组/ones_like
以另一个数组为参数,根据其形状和dtype创建一个全1数组zeros
/zeros_like
:与ones
/ones_like
,产生全0数组empty
:创建新数组,只分配内存空间不填充任何值eye
/identify
:创建一个N × N N \times NN×N单位矩阵
numpy.random
对Python内置的random进行了补充,增加了一些用于高效生产多种概率分布的样本值的函数
random(size=None)
:产生[ 0 , 1 ) [0,1)[0,1)上随机值rand(d0, d1, ..., dn)
:产生[ 0 , 1 ) [0,1)[0,1)上均匀分布的样本值randint(low, high=None, size=None, dtype='l')
:给定的上下限范围内随机选取整数randn(d0, d1, ..., dn)
:产生正态分布(平均值为0,标准差为1)的样本值binomial(n, p, size=None)
:产生二项分布的样本值normal(loc=0.0, scale=1.0, size=None)
:产生正态(高斯)分布的样本值beta(a, b, size=None)
:产生Beta分布的样本值chisquare(df, size=None)
:产生卡方分布的样本值gamma(shape, scale=1.0, size=None)
:产生Gamma分布的样本值uniform(low=0.0, high=1.0, size=None)
:产生[ l o w , h i g h ) [low,high)[low,high)上长均匀分布的样本值
When you print a 3-dimensional NumPy array, the text output visualizes the array differently than shown here. NumPy’s order for printing n-dimensional arrays is that the last axis is looped over the fastest, while the first is the slowest.
np.arange(6) np.arange(6).reshape(2,3) np.ones((3,2)) np.zeros((3,2)) np.empty((3,2)) np.eye(5)
np.random.random((3,2)) np.random.rand(2,3) np.random.randint(1,10,size=(2,3)) np.random.randn(2,3) np.random.uniform(5,10,size=(2,3))
2 索引与切片
Numpy数组的索引和切片与Python列表功能差不多,跟列表的重要区别在于,数组切片是原始数组的试图,数据不会被复制,视图上的任何修改都会直接反应到源数组上。
(1)基本索引与切片
数组的索引与切片
矩阵的索引与切片
(2)布尔型索引
对于数组names,假设每个名字对应data数组的一行,选出名字为’Bob’的所有行:对names数组和字符串’Bob’的比较运算将会产生一个布尔型数组,这个数组可用于数组索引(该数组长度必须与被索引轴的长度一致)。
names = np.array(['Bob','Joe','Will','Will','Alice','Joe','Bob']) names=='Bob' names[names=='Bob'] names[names!='Bob']
(3) 花式索引
花式索引(Fancy indexing)是一个Numpy术语,指的是利用整数数组进行索引,以特定顺序选取行子集或列子集。
arr = np.arange(20).reshape(5,4) arr[[2,0,3]] #按顺序分别选取第2、0、3行 arr[:,[1,2]] #按顺序分别选取第2、3列
3 数学运算
(1)数组运算
Numpy数组运算使得不用编写循环即可对数据执行批量运算,通常称为矢量化(Vectorization)
不同大小数组之间的运算称为广播(broadcasting),如以下向量与标量直接的运算
(2)矩阵运算
算数运算
点积运算
计算过程如下:
numpy.linalg
中有一组标准的矩阵分解、求逆和行列式的方法,与Matlab和R语言使用的是相同的行业标准级Fortran库,主要如下:
diag
:以一维数组的形式返回方阵对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)dot
:矩阵乘法trace
:对角线元素的和det
:矩阵行列式eig
:方阵的本征值和本征向量inv
:方阵的逆pinv
:矩阵的Moore-Penrose伪逆qr
:QR分解svd
:SVD分解solve
:解线性方程组A x = b Ax = bAx=b,A AA为方阵lstsq
:A x = b Ax=bAx=b的最小二乘解
4 统计方法
基本统计方法
sum
:全部或轴向元素求和mean
:算数平均数。std
/var
:标准差/方差min
/max
:最小值/最大值argmin
/argmax
:最大和最小元素的索引cumsum
:所有元素的累积和cumprod
:所有元素累积积
数组的聚合统计
矩阵的聚合统计
既可以基于行,也可以基于列
5 函数
Numpy可以看做简单函数的矢量化包装器。
(1)一元通用函数
abs
:绝对值sqrt
:平方根square
:平方exp
:指数e x e^xexlog
/log10
/log2
:分布对应底数为e ee(自然对数)、底数为10、底数为2的log \loglogceil
:大于等于该值的最小整数floor
:小于等于该值的最大整数
(2)二元通用函数
add
:数组对应元素相加subtract
:数组对应元素相减multiply
:数组元素相乘divide
:数组元素相除power
:计算A B A^BAB,其中A AA为第一个数组中的元素,B BB为第二个数组中的元素mod
:元素级求模
6 其他方法
(1)转置
进行矩阵运算时,经常需要该操作,如利用np.dot
计算矩阵内积X T X X^TXXTX。数组不仅有transpose
方法,还有一个T属性。
arr = np.arange(15).reshape((3,5)) np.dot(arr,arr.T)
(2)np.where
np.where
是三元表达式x if condition else y
的矢量化版本。
arr = np.random.randn(4,4) np.where(arr>0,2,-2) #正值设为2,负值设为-2
7 应用
(1)文本
对于文本需要将句子分成一个token 数组(基于通用规则的单词或单词的一部分),然后使用词汇表中的ID替换每个单词。
由于这些 ID 仍然没有为模型提供太多信息价值,一般使用word2vec嵌入(本例中为 50 维 word2vec 嵌入),NumPy 数组的维度为 [embedding_dimension x sequence_length] 。
像 BERT 这样的模型期望的输入形式是:[batch_size,sequence_length,embedding_size]:
(2)图像
对于彩色图像,每个像素由表示红绿蓝的三个数字表示,因此彩色图像由尺寸为(高 x 宽 x3)的 三维ndarray 表示:
(3)音频
CD质量的音频每秒包含44,100个样本,每个样本是-65535到65536之间的整数。音频文件是样本的一维数组,每个样本都是一个数字,代表音频信号的一小部分。对于10 秒的 CD 质量 WAVE 文件,可以将其加载到长度为10 × 44 , 100 = 441 , 000 10 \times 44,100 = 441,00010×44,100=441,000 的 NumPy 数组中。