Numpy库为什么如此高效
Numpy是由C语言编写,整体执行效率高,Numpy数组内的数据必须是完全统一的,比如全部是浮点型,而Python列表中支持任意类型数据的随意组合,Numpy数组内的数据连续存储在内存中,而Python列表数据分散在内存中,这种存储结构,与一些更加高效的底层处理方法更加的契合,除此之外,Python语言执行有线程锁,无法真正实现多线程,而C语言可以,因此Numpy库的效率更高
什么时候用Numpy
在数据处理的过程中,遇到for循环实现的一些向量化,矩阵化操作的时候,优先考虑Numpy
1、两个向量的点乘
2、矩阵乘法
Numpy数组的创建
1、通过列表创建
import numpy
x = numpy.array([1,2,3],dtype="int") #dtype表示数据类型
print(x)
2、从头创建数组
(1)创建一维数组初值为0
x = numpy.zeros(5,dtype = int)
#表示创建一个5个元素都为0的一维数组
(2)创建二维数组初值为1
x = numpy.ones((2,4),type = int)
#表示创建一个2 * 4的int型二维数组,并且初值都为1
(3)创建自定义二维数组
x = numpy.full((2,4),8)
#表示创建一个2 * 4的二维数组,并且初值为8
(4)创建单位矩阵
x = numpy.eye(3)
#表示创建一个3*3的单位矩阵
(5)创建线性序列
numpy.arange(1,10,2)
#从1到10步长为2创建序列
(6)创建等差数列
x = numpy.linspace(1,10,4)
#a1 = 1,a4 = 10
(7)创建等比数列
x = numpy.logspace(1,9,2)
#a1 = 2的0次方,a9 = 2的9次方
(8)创建0-1之间随机分布的数组
x = numpy.random.random(3*3)
#生成一个3 * 3的元素都为0-1之间随机分布的数组
(9)创建整数类型的随机数组
x = numpy.random.randint(0,10,(3,3))
#创建一个0-10之间随机元素组成的3*3的二维矩阵
(10)数组的合并
a = [1,2,3]
b = [4,5,6]
x = numpy.concatenate((a,b)) #将数组a,b合并为数组x
print(x)
Tip:Numpy数组中的切片与Python列表基本一致
Numpy数组的属性
1、shape返回数组的形状
x = numpy.full((2,4),8)
print(x.shape[0]) # 返回数组的行
print(x.shape[1) # 返回数组的列
2、nidm返回数组的维度
x = numpy.full((2,4),8)
print(x.nidm)#这里输出的结果就为2,因为是2维数组
3、size返回数组的大小(即元素个数)
x = numpy.full((2,4),8)
print(x.size)#这里输出的结果就为8,因为是2*4的二维数组
4、mean()返回数组的算术平均值
x = numpy.arange(24).reshape((2,3,4))
print(x.mean())
Numpy数组的变形
1、reshape(n,m):
将数组转换为n行m列的数组(不改变原数组)
import numpy as np
x1 = np.arange(1,7).reshape(2,3)
print(x1)
2、resize(n,m):
用法和reshape一样但直接改变原数组
3、flatten():
将数组转换为一维向量(返回的是副本)
4、ravel():
将数组转换为一维向量(返回的是视图)
Numpy数组的拼接
1、np.hstack()/np.c_[]:
水平拼接,要保证两个数组的行数一致
2、np.vstack()/np.r_[]:
垂直拼接,要保证两个数组列数一致
Numpy数组的分割:
1、np.hsplit(x,[2,4]):
水平分割,将数组x从第2行,第四行分割成三部分
2、np.vsplit(x,[2,4]):
垂直分割,将数组x从第2列,第四列分割成三部分
Numpy数组的运算:
向量运算:
Numpy数组在执行运算时,是对数组内的每一个元素进行运算,下面介绍除基本运算以外的其他运算
函数 | 描述 |
---|---|
np.abs(x) | 对x中的所有元素进行绝对值运算 |
np.sin(x) / np.cos(x) / np.tan(x) / np.arcsin(x) / np.arccos(x) / np.arctan(x) | 对x中的元素进行三角函数及反三角函数的相关运算 |
np.exp(x) | 对x中的元素进行指数运算(e) |
np.ln(x) / np.log2(x) / np.log10(x) | 对x中的元素进行对数运算(以e/2/10为底) |
np.rint(x) | 对数组各元素的值四舍五入 |
np.modf(x) | 将数组各元素的小数和整数部分以两个独立的数组形式返回 |
import numpy as np
x1 = np.arange(1,7).reshape(2,3)
print(x1)
print(x1 + 4)
矩阵运算:
(1)x.T:返回x的转置矩阵
(2)x.dot(y) / np.dot(x,y):返回矩阵x与矩阵y相乘的结果,这里与x * y不同,x * y是向量相乘也就是对应项相乘,而矩阵的乘法要严格遵守数学中的矩阵乘法规则
比较运算和掩码
import numpy as np
x1 = np.arange(-3,3).reshape(2,3) #生成一个2行3列,数据由-3~3构成的数组
x2 = x1 > 0 #返回x1 > 0 的布尔数组
print(x2)
np.sum()
import numpy as np
x1 = np.arange(-3,3).reshape(2,3) #生成一个2行3列,数据由-3~3构成的数组
print(x1)
print(np.sum(x1 > 0)) #这里返回的不是大于0的数字的和,而是大于0的数字个数
np.all()
import numpy as np
x1 = np.arange(-3,3).reshape(2,3) #生成一个2行3列,数据由-3~3构成的数组
print(x1)
print(np.all(x1 > 0)) #如果数组x1中所有的元素都满足大于0的条件输出True,否则输出False
np.any()
import numpy as np
x1 = np.arange(-3,3).reshape(2,3) #生成一个2行3列,数据由-3~3构成的数组
print(x1)
print(np.any(x1 > 0)) #如果数组x1中至少有一个元素都满足大于0的条件输出True,否则输出False
将布尔数组作为掩码
import numpy as np
x1 = np.arange(-3,3).reshape(2,3) #生成一个2行3列,数据由-3~3构成的数组
print(x1[x1 > 0]) #将布尔数组中所有返回为True的元素输出
花哨索引
一维向量的花哨索引:
import numpy as np
x = np.arange(1,7).reshape(-1) #建立一个一维数组
index = [0,2,4]
print(x[index]) #输出下标为0,2,4的元素
二维向量的花哨索引:
import numpy as np
x = np.arange(1,7).reshape(2,3) #建立一个一维数组
print(x)
index = [[0,1],[1,2]]
print(x[index]) #输出下标为[0,1],[1,2]的元素
Numpy中的广播
NumPy中,形状不同的数组之间也可以进行运算。之前的例子中,在 2×2的矩阵A和标量10之间进行了乘法运算。在这个过程中,如图所示, 标量10被扩展成了2×2的形状,然后再与矩阵A进行乘法运算。这个巧妙 的功能称为广播(broadcast)。
import numpy as np
x1 = np.arange(1,7).reshape(2,3) #2行3列的二维数组
x2 = np.arange(1,4).reshape(-1) #一维数组
print(x1)
print(x2)
print(x1*x2) #相乘时一维数组自动扩展,变为二维数组,再进行相乘
CSV文件
np.savetxt
np.savetxt(frame,array,fmt = ‘’,delimiter = None)
frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件
array:存储文件的数组
fmt:写入文件的格式。例如’%d’
delimiter: 分割字符串,默认是任何空格
np.loadtxt
np.loadtxt(frame,dtype = , delimiter = None,unpack = False)
frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件
delimiter: 分割字符串,默认是任何空格
dtype:数据类型,可选
Tip:Numpy数组在数据处理中尤为重要🙃
- 本文链接:http://yoursite.com/2020/04/06/Numpy%E6%95%B0%E7%BB%84%E6%93%8D%E4%BD%9C/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub IssuesGitHub Discussions