NumPy 即 Numerical Python,它是Python的一个扩展程序库,主要针对数组和矩阵的运算,它经常和SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,这样可以基本代替Matlib的使用,而这一组合经常应用于机器学习和数据科学中。
1.ndarray指的是多维数组,存放的是同类型元素,每个元素在内存中有相同储存大小的区域,ndarray对象由计算机内连续的一部分组成,并结合索引,每个元素依次映射到内存块的一个位置中。
2.数组的参数
(1)bool_ 布尔型数据类型(True 或者 False)
(2)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)
(3)float_ float64 类型的简写
float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
(4)complex_ complex128 类型的简写,即 128 位复数
complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)
dt1=np.dtype(np.int32)
dt2=np.dtype('i4') # 'i1','i2','i4','i8'分别代表int8,int16,in32,int64
#结构化数据类型:通过元组创建
例:
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print(a['age'])
输出结果为:[10 20 30]
数组的维度称为秩,也就是轴(axis)的数量。对于二维数组来说,axis=0,即沿着第0轴(行)来进行操作,沿着行就是对每一列进行操作;同理,axis=1意味着对每一行进行操作。
相关函数
np.apply_along_axis(函数,轴向,高维数组) #沿某个轴对数组使用函数
#参数order order为可选参数(C:按行方向,F:按列方向,A:按照原顺序,K:按照元素在内存中的数据)
a.reshape(newshape, order)
a.shape=(newshape)
a.resize()
a.flat #生成一个数组元素迭代器
a.flatten(order) #生成一份拷贝的数组,形状是一维
a.ravel(order) #返回一维数组的视图,修改值后会影响原来的数据
#转置至少是2维
a.T #转置
a.transpose(axes) #
示例:一维数组的转置
a=np.array([1,2,3,4,5])
print(np.array([a]).T)#先转换成2维数组再进行转置
print(a.reshape(-1,1)) #重新定义形状,让它变成只有一列
np.concatenate((a1,a2,...),axis=0) ##数组要求维度相同,且除了axis轴外其他方向上的形状相同
np.stack((a1,a2,...),axis=0)
np.hstack((a1,a2,...))#水平堆叠
np.vstack((a1,a2,...))#竖直堆叠
np.row_stack((a1,a2,...))/np.r_[a1,a2,...]#将行堆叠
np.column_stack((a1,a2,...))/np.c_[a1,a2,...]#将列堆叠
注意:一维情况
a=np.array([1,2,3])
b=np.array([7,8,9])
print(np.vstack((a,b)))
#结果是[[1 2 3]
[7 8 9]]
print(np.r_[a,b])
#结果是[1 2 3 7 8 9]
print(np.hstack((a,b)))
#结果是[1 2 3 7 8 9]
print(np.c_[a,b])
#结果是[[1 7]
[2 8]
[3 9]]
np.split(a,indices/nums,axis) #将数组沿着某个轴切分,按照切片或者平均分成几组
np.hsplit(a,indices/nums)#水平切分
np.vsplit(a,indices/nums)#竖直切分
np.dsplit(a,nums)#适用于三维及以上,将二维数组由前至后排列,用一个水平面依次截,得到的某一层元素组成一个数组
np.append(a, values, axis)#沿某个轴添加元素
np.insert(a,obj,values,axis)
#obj为在该值前插入的索引
#如果没有设置axis,那么插入时会展开,如果设置了axis,则直接插入,必要时会自动广播
np.delete(a,obj,axis)#规则同insert函数
np.unique(a, return_index, return_inverse, return_counts)
#return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
#return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
#return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数
ndarray.clip(min,max)#将数组中小于x的数设置为min,将数组中大于max的数设置为max
ndarray.compress(条件)#返回调用数组中满足给定条件的元素
ndarray.prod()#返回调用数组中各元素的乘积
ndarray.cumprod()#返回调用数组中各元素计算累乘的过程数组
np.nditer(a,order)
np.nditer(a,op_flags=['readwrite'])# 默认情况下为只读模式,将op_flags改为readwrite或者write-only,即可进行操作
np.nditer(a,flags=['external_loop'],oder='F')#给出的值是具有多个值的一维数组,按列组合