NumPy基础:数组和矢量计算
NumPy的部分功能如下:
- ndarray,一个具有矢量算术运算和复杂广播能力的多维数组。
- 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
魔法函数
- 魔法函数使我们能够以简单的代码实现复杂功能
%%timeit -n (n)
NumPy 数据类型
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
数据类型对象 (dtype)
数据类型对象(numpy.dtype 类的实例)用来描述与数组对应的内存区域是如何使用,它描述了数据的以下几个方面::
- 数据的类型(整数,浮点数或者 Python 对象)
- 数据的大小(例如, 整数使用多少个字节存储)
- 数据的字节顺序(小端法或大端法)
- 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
- 如果数据类型是子数组,那么它的形状和数据类型是什么。
字节顺序是通过对数据类型预先设定 < 或 > 来决定的。 < 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。> 意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
dtype 对象是使用以下语法构造的:
numpy.dtype(object, align, copy)
- object - 要转换为的数据类型对象
- align - 如果为 true,填充字段使其类似 C 的结构体。
- copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
NumPy 数组属性
NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。
在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。
很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray 对象的内存信息 |
ndarray.real | ndarray元素的实部 |
ndarray.imag | ndarray 元素的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。 |
NumPy 创建数组
numpy.empty 用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
numpy.empty(shape, dtype = float, order = 'C')注意 − 数组元素为随机值,因为它们未初始化。
参数说明:
参数 描述 shape 数组形状 dtype 数据类型,可选 order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
numpy.zeros创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = 'C')参数说明:
参数 描述 shape 数组形状 dtype 数据类型,可选 order 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组
numpy.ones创建指定形状的数组,数组元素以 1 来填充:
numpy.ones(shape, dtype = None, order = 'C')参数说明:
参数 描述 shape 数组形状 dtype 数据类型,可选 order 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组
numpy.asarray
numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
numpy.asarray(a, dtype = None, order = None)参数说明:
参数 描述 a 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组 dtype 数据类型,可选 order 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
numpy.frombuffer 用于实现动态数组
numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)注意:buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。
参数说明:
参数 描述 buffer 可以是任意对象,会以流的形式读入。 dtype 返回数组的数据类型,可选 count 读取的数据数量,默认为-1,读取所有数据。 offset 读取的起始位置,默认为0。
numpy.fromiter方法从可迭代对象中建立 ndarray 对象,返回一维数组
numpy.fromiter(iterable, dtype, count=-1)
参数 描述 iterable 可迭代对象 dtype 返回数组的数据类型 count 读取的数据数量,默认为-1,读取所有数据
numpy.arange
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。
参数说明:
参数 描述 start
起始值,默认为 0
stop
终止值(不包含) step
步长,默认为 1
dtype
返回 ndarray
的数据类型,如果没有提供,则会使用输入数据的类型。
numpy.linspace函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)参数说明:
参数 描述 start
序列的起始值 stop
序列的终止值,如果 endpoint
为true
,该值包含于数列中num
要生成的等步长的样本数量,默认为 50
endpoint
该值为 true
时,数列中包含stop
值,反之不包含,默认是True。retstep
如果为 True 时,生成的数组中会显示间距,反之不显示。 dtype
ndarray
的数据类型
numpy.logspace 函数用于创建一个于等比数列。格式如下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)base 参数意思是取对数的时候 log 的下标。
参数 描述 start
序列的起始值为:base ** start stop
序列的终止值为:base ** stop。如果 endpoint
为true
,该值包含于数列中num
要生成的等步长的样本数量,默认为 50
endpoint
该值为 true
时,数列中中包含stop
值,反之不包含,默认是True。base
对数 log 的底数。 dtype
ndarray
的数据类型
np.xi_ 中输入两个列表,则第一个列表存的是待提取元素的行标,第二个列表存的是待提取元素的列标,第一个列表中的每个元素都会遍历第二个列表中的每个值,构成新矩阵的一行元素;例子x[np.ix_([1,5,7,2],[0,3,1,2])]:x[1,0] x[1,3] x[1,1] x[1,2] x[5,0] x[5,3] x[5,1] x[5,2] x[7,0] x[7,3] x[7,1] x[7,2] x[2,0] x[2,3] x[2,1] x[2,2]
数组切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
切片
开始:结束:步长 #索引从0开始,左闭右开
切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
索引
NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。
布尔索引
我们可以通过一个布尔数组来索引目标数组。
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
花式索引
指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应下标的行,如果目标是二维数组,那么就是对应位置的元素。
花式索引跟切片不一样,它总是将数据复制到新数组中。
NumPy 广播(Broadcast)
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
下面的图片展示了数组 b 如何通过广播来与数组 a 兼容。
4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算;
广播的规则:
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
- 输出数组的形状是输入数组形状的各个维度上的最大值。
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
- 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
简单理解:对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:
- 数组拥有相同形状。
- 当前维度的值相等。
- 当前维度的值有一个是 1。
若条件不满足,抛出 "ValueError: frames are not aligned" 异常。
数组函数
arr.reshape(数值1,数值2,...) #重塑元素类型
arr.max() # 等价于 np.max(arr) 最大值
arr.min() # 等价于 np.min(arr) 最小值
arr.mean() # 等价于 np.mean(arr) 平均值
arr.sum() # 等价于 np.sum(arr) 求和
arr.log() #等价于 np.log(arr) e为底的对数
arr.exp() #等价于 np.exp(arr) e的几次方
arr.std() #等价于 np.std(arr) arr的标准差
arr.var() #等价于 np.var(arr) arr的方差
arr.argmax() #等价于 np.argmax(arr) 最大值所在的位置
arr.argmin() #等价于 np.argmin(arr) 最小值所在的位置
arr.floor() #等价于 np.floor(arr) 小于数组元素的最大整数
arr.ceil() #等价于 np.ceil(arr) 大于数组元素的最小整数
arr.round(n) #等价于 np.round(arr) 数组元素保留n位小数
arr.sqrt() #等价于 np.sqrt(arr) 返回输入数组中每个元素的平方根数组
arr.T 或 arr.transpose() #矩阵转置
arr.dot(arr.T) #等价于 np.dot(arr,arr.T) #进行矩阵乘法 (点积)
数组添加元素
np.vstack((原数组,想添加的数组)) #添加行, 参数要有(), [ ]==( )
np.hstack((原数组,想添加的数组)) #添加列, 参数要有(), 数据要体现出列的关系[:,[ ]]
np.hstack((arr1,[[1],[2],[3]])) #[1],[2],[3]] 可以用元组,但内部元素不要元组sss=np.append(原数组,想添加的数组,axis) #shape=shape(reshape(),axis=1)
sss=np.insert(原数组,位置,想添加的list,axis) #二维数据 只要len一致即可
sss=np.insert(原一维数组,位置,想添加的list)#一维数据
函数
np.multiply(mat1,mat2) #矩阵计算对应位置乘法 arr1 * arr2
np.sort(a,axis=1|0) #排序 ,以第一列对行进行排序,或以第一行对列进行排序
np.argsort(a,axis=1|0) #排序后的数组在原数据中的索引
a.ravel() #数组展开为一维度
np.cumsum(a) #累加函数
np.where(条件,T,F) #等价于excel的if,可嵌套
np.unique(数组)#对数据去重
NumPy IO
Numpy 可以读写磁盘上的文本数据或二进制数据。
NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。
npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。
常用的 IO 函数有:
- load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。
- savez() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。
- loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)
numpy.save()
numpy.save() 函数将数组保存到以 .npy 为扩展名的文件中。
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
参数说明:
- file:要保存的文件,扩展名为 .npy,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上。
- arr: 要保存的数组
- allow_pickle: 可选,布尔值,允许使用 Python pickles 保存对象数组,Python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。
- fix_imports: 可选,为
np.savez
numpy.savez() 函数将多个数组保存到以 npz 为扩展名的文件中。
numpy.savez(file, *args, **kwds)
参数说明:
- file:要保存的文件,扩展名为 .npz,如果文件路径末尾没有扩展名 .npz,该扩展名会被自动加上。
- args: 要保存的数组,可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为 arr_0, arr_1, … 。
- kwds: 要保存的数组使用关键字名称。
- 了方便 Pyhton2 中读取 Python3 保存的数据。
savetxt()
savetxt() 函数是以简单的文本文件格式存储数据,对应的使用 loadtxt() 函数来获取数据。
np.loadtxt(FILENAME, dtype=int, delimiter=' ') np.savetxt(FILENAME, a, fmt="%d", delimiter=",")
参数 delimiter 可以指定各种分隔符、针对特定列的转换器函数、需要跳过的行数等。