Numpy
Numpy简介
Numpy是开源的Python科学计算库,用于快速处理任意维度的数组。
Numpy支持常见的数组和矩阵操作。对于同样的数值的计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
- ndarray的优势
- 内存块风格:ndarray在存储数据时是连续存储的,不像python的list先得寻址再找数据
- ndarray支持并行化运算:Numpy底层使用C语言编写,内部杰出了GIL锁,器对数组得操作速度不受python解释器的限制。
N维数组-ndarray
- 生成ndarray方法
1 | # 按照输入的列表生成一个数组 |
- ndarray的属性
1 | import numpy as np |
名称 | 描述 | 简写 |
---|---|---|
np.bool | 用一个字节存储的布尔类型(True或False) | ‘b’ |
np.int8 | 一个字节大小,-128 至 127 | ‘i’ |
np.int16 | 整数,-32768 至 32767 | ‘i2’ |
np.int32 | 整数,-2 31 至 2 32 -1 | ‘i4’ |
np.int64 | 整数,-2 63 至 2 63 - 1 | ‘i8’ |
np.uint8 | 无符号整数,0 至 255 | ‘u’ |
np.uint16 | 无符号整数,0 至 65535 | ‘u2’ |
np.uint32 | 无符号整数,0 至 2 ** 32 - 1 | ‘u4’ |
np.uint64 | 无符号整数,0 至 2 ** 64 - 1 | ‘u8’ |
np.float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | ‘f2’ |
np.float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | ‘f4’ |
np.float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | ‘f8’ |
np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | ‘c8’ |
np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | ‘c16’ |
np.object_ | python对象 | ‘O’ |
np.string_ | 字符串 | ‘S’ |
np.unicode_ | unicode类型 | ‘U’ |
基本操作
索引切片
索引:直接由外到内依次进行索引(用”,”隔开)[num,num,…]
切片:和python一样也是由外到内进行切片[num:num,num:num,…]
花式索引:array[[num1,num2,…]],返回一个array第num1个元素,第num2个…..,组成的array
array[[num1,num2,…], [num3,num4,…]] 返回一个array第num1行的第num3的元素,第num2行的第num4个元素
形状改变
- ndarray.reshape(shape, order):返回一个具有相同数据域,但是shape不一样的array(装换前元素个数个转换后的个数必须一样)
1
2
3np1 = np.array([[1,2,3],[4,5,6]])
np2 = np1.reshape([3,2]) # array([[1,2],[3,4],[5,6]])
np2 = np1.reshape([-1,2]) # -1 表示待计算,只有np1元素总个数能够整除2就行- ndarray.resize(shape):在array原本的基础上进行修改,不返回新的元素
1
2np1 = np.array([[1,2,3],[4,5,6]])
np1.resize([3,2])- ndarray.transpose():对数组进行转置,返回新的数组(可以指定轴进行转换)
- ndarray.T:对数组进行转置,返回新的数组
1
np1.T
类型改变
- ndarray.astype(type):返回新的改变类型后的数组
1
np2 = np1.astype(np.float)
- ndarray.tostring()或ndarray.tobytes():把数组转换成base64的字符串
数组取重
- np.unique(array):把数组拉平然后返回一个拉平后的去重数组
1
2np1 = np.array([[1,2,3,4],[3,4,5,6]])
np2 = np.unique(np1) # array([1,2,3,4,5,6])ndarray运算
逻辑运算
1
2
3
4np1 = np.array([[1,2,3,4],[3,4,5,6]])
np1>3 # 返回一个相同形状的True和Flase的矩阵,大于3的为True,否则为Flase
np1[np1>3]=0 # 把是所有大于3的数据赋值为0通用判断
- np.all(array):判断array是否全为True
- np.any(array):判断array中是否有True
三元逻辑运算
- np.where(array>num, 1, 0):把array中元素大于num的设置成1,否则设置成0.
- 复合逻辑
1
2np.logical_and(array>num1, array<num2) #同and,返回一个与array形状相同的True/Flase矩阵,满足条件的为True
np.logical_or(array>num1, array<num2) #同or,返回一个与array形状相同的True/Flase矩阵,满足条件的为True统计运算
- np.min(array,axis):返回沿axis轴最小值
- np.max(array,axis):返回沿axis轴最大值
- np.median(array,axis):返回沿axis轴中值
- np.mean(array,axis):返回沿axis轴平均值
- np.std(array,axis):返回沿axis轴标准差
- np.var(array,axis):返回沿axis轴方差
- np.argmax(array,axis):返回沿axis轴最大值的下标
- np.argmin(array,axis):返回沿axis轴最小值的下标
ndarray间的运算
数组与数之间的运算,分别对每个元素进行运算
数组与数组间的运算
加、减:shape得一样或者对低维数组使用广播机制进行拓展之后可以使它们的shape一样
乘:前面的数组的行与后门数组的列必须使一致的,才能进行计算(M,N)*(N,L)=(M,L)
1
2
3np.matmul(array,array)
np.dot(array,array)
# 区别在于matmul禁止使用矩阵与标量相乘
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zoubinbf@163.com