Numpy基础知识点汇总
全文共2371字,预计阅读时间15分钟。
概述
Numpy是高性能科学计算和数据分析的基础包,它的部分功能如下:
1)ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
2)对整组数据进行快速运算的标准数学函数
3)用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
nadarry的创建
这一节,我们主要关注ndarray数组的创建,我们主要有以下几种方式:
数组转换
创建数组的最简单的方法就是使用array函数,将Python下的list转换为ndarray。
#通过数组创建一个ndarraydata1 = [6,7.5,8,0,1]arr1 = np.array(data1)arr1
输出为:
array([ 6. , 7.5, 8. , 0. , 1. ])
也可以创建二维数组
#通过数组创建一个二维的ndarraydata2 = [[1,2,3,4],[5,6,7,8]]arr2 = np.array(data2)arr2
输出为:
array([[1, 2, 3, 4], [5, 6, 7, 8]])
数组生成
除了通过数组转换而来之外,我们可以利用np中的一些内置函数来创建数组,比如我们创建全0的数组,也可以创建全1数组,或者等差数列数组:
##创建全0数组np.zeros(10)
输出为:
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])np.ones(3)
输出为:
array([ 1., 1., 1.])#创建等差数组np.arange(1,15,2)
输出为:
array([ 1, 3, 5, 7, 9, 11, 13])
我们已可以生成一些随机数数组,比如下面的方式可以生成均值为2,标准差为3的正态分布数组:
#创建正态分布随机数数组samples = np.random.normal(2,3,size=(4,4))samples
输出为:
array([[ 3.22094168, 2.83535518, 6.08625335, 1.28604611],[ 1.28741059, -2.76328197, 3.04233101, 2.01606861],[-4.01262367, -1.12355259, 0.59416967, 4.07616321],[-1.9936047 , 0.32834631, 5.64805711, 4.19171525]])
如果想生成标准正态分布随机数组,可以直接使用randn函数:
#创建正态分布数组samples1 = np.random.randn(4,4)samples
输出为:
array([[ 2.61680992, 1.72497013, 2.97738852, 0.78316473],[ 3.41222285, 3.50582899, 2.5927854 , 5.09012117],[ 0.55369215, 6.66957866, 4.37837409, 5.25935515],[-0.82391358, -2.22526414, 0.2730311 , 1.69091322]])
我们也可以使用randint生成随机整数数组,前两个参数决定了数组中数据的值的上下限:
#创建随机整数数组draws = np.random.randint(0,10,size=(3,4))draws
输出为:
array([[2, 2, 4, 5],[7, 5, 8, 5],[9, 0, 6, 1]])
文件读取
numpy还可以读取txt或者csv文件来创建ndarray,也可以读取从别的代码中保存的np文件,我们可以使用save方法保存ndarray到一个npy文件,也可以使用savez将多个array保存到一个.npz文件中:
x = np.array([1,2,4,5])y = np.array([3,4,5])#save方法可以存取一个ndarraynp.save("x_arr",x)#如果要存取多个数组,要是用savez方法np.savez("some_array.npz",xarr = x,yarr=y)
保存文件之后,我们可以通过load方法来读取存储的数组,如果是.npz文件的话,读取之后相当于形成了一个k-v类型的变量,通过保存时定义的key来获取相应的array。
np.load('x_arr.npy')#array([1, 2, 4, 5])arch = np.load("some_array.npz")arch['yarr']#array([3, 4, 5])
np.loadtxt 和 np.savetxt可以用来存取txt或csv文件:
arr = np.loadtxt('array_ex.txt',delimiter=',',dtype=np.int32)arr#array([[1, 2, 3, 4, 5],# [2, 3, 4, 5, 6],# [4, 5, 7, 8, 9]], dtype=int32)
np.savetxt("array_ex1.txt",arr)
ndarray的数据类型
ndarray的数据类型有int8、int16、int32、int64、float16、float32、float64等等,我们可以在创建数组时显式指定数据类型:
#指定array的数据类型arr1 = np.array([1,2,3],dtype=np.int32)arr2 = np.array([1,2,3],dtype=np.float32)
我们可以使用数组的dtype属性对数组的数据类型进行查看:
#查看array的数据类型arr2.dtype### dtype('float32')
我们可以使用astype将一个数组的数据类型进行转换,这样会返回一个新的数组,对原数组不会产生影响
#数据类型进行转换,会产生一个新的array,原array不产生影响arr1.astype(np.float32)arr1.dtype# dtype('int32')
float_arr = arr1.astype(np.float32)float_arr.dtype# dtype('float32')
如果一个数组中的字符串只含有数字,可以将string转换为数值形式:
numeric_strings = np.array(['1.25','0.96','42'],dtype=np.string_)numeric_strings.astype(np.float32)# array([ 1.25 , 0.95999998, 42. ], dtype=float32)
数组运算
大小相等的数组之间的任何算数运算都会应用到元素身上
arr = np.array([[1,2,3],[4,5,6]],dtype=np.float32)arr * arr
#array([[ 1., 4., 9.],# [ 16., 25., 36.]], dtype=float32)
arr - arr
#array([[ 0., 0., 0.],# [ 0., 0., 0.]], dtype=float32)
数组与标量的算术运算也会将标量值传播到各个元素:
1 / arr
#array([[ 1. , 0.5 , 0.33333334],# [ 0.25 , 0.2 , 0.16666667]], dtype=float32)
索引和切片
基本的索引和切片
numpy基本的索引和切片功能和Python列表的操作相似,不过要注意的是numpy中数组切片是原始数组的视图,这意味着数据不会被复制,视图上任何数据的修改都会反映到原数组上,因为numpy被设计用来处理大数据,如果切片不是视图而是复制产生新数据的话,会产生相应的性能和内存问题。如下面的例子,对切片的操作会影响原数组:
arr = np.arange(10)arr[5]# 5arr[5:8]#array([5, 6, 7])arr[5:8]=12t = arr[5:8]t[1] = 12345arr#array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])
如果你想得到复制的数据的话,使用copy方法,可以看到使用copy之后再修改数据不会影响到原数据:
t1 = arr[5:8].copy()t1[2] = -222arr
#array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
对于二维数组或者高维数组,我们可以按照之前的知识来索引,当然也可以传入一个以逗号隔开的索引列表来选区单个或多个元素
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])arr2d[0,2]#3
arr2d[:2,1:]#array([[2, 3],# [5, 6]])
布尔型索引
我们还可以使用布尔型的索引形式:
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])data = np.random.randn(7,4)
names == 'Bob'#array([ True, False, False, True, False, False, False], dtype=bool)
data[names=='Bob']#array([[ 0.75323688, 0.85622553, -2.71974541, 0.37865467],# [ 1.35356641, 0.09263267, 1.96207471, -0.05549953]])
在使用布尔型索引形式时,我们可以进行相应的逻辑运算,不过这里的或是一根竖线,与是一个&:
data[(names=='Bob')| (names=='Will')]
#array([[ 0.75323688, 0.85622553, -2.71974541, 0.37865467],[ 0.93720776, -1.49360063, -0.06471438, 0.62149438],[ 1.35356641, 0.09263267, 1.96207471, -0.05549953],[ 1.87344915, 1.75085643, 1.9197879 , 0.47687361]])
花式索引
除基本的索引和切片外,numpy还提供了花式索引的方式,它指利用整数数组进行索引,花式索引和切片不一样,它总是将数据复制到新数组中:
arr = np.empty((8,4))for i in range(8):arr[i] = iarr[[4,3,0,6]]
上面的语句按4,3,0,6的顺序选取了数组中的四行,所以得到的结果为:
array([[ 4., 4., 4., 4.],[ 3., 3., 3., 3.],[ 0., 0., 0., 0.],[ 6., 6., 6., 6.]])
我们也可以使用负数从最后一行开始选取:
arr[[-3,-5,-7]]
如果我们想选择一块方形区域,同时按照我们指定的顺序排列数据,我们尝试以下的方式:
arr = np.arange(32).reshape((8,4))arr[[1,5,7,2],[0,3,1,2]]
输出为:
array([ 4, 23, 29, 10])
这是因为按照上面的方式进行选取,会将选择出的元素锁定在4个元素上。
正确的方式有下面两种:
arr[[1,5,7,2]][:,[0,3,1,2]]arr[np.ix_([1,5,7,2],[0,3,1,2])]
输出为:
array([[ 4, 7, 5, 6],[20, 23, 21, 22],[28, 31, 29, 30],[ 8, 11, 9, 10]])
数组转置和轴对换
数组的转置是重塑的一种特殊形式,它返回的事原数据的视图。不仅有transpose方法,还有特殊的T属性:
arr = np.arange(15).reshape((5,3))arr.T
#array([[ 0, 3, 6, 9, 12],[ 1, 4, 7, 10, 13],[ 2, 5, 8, 11, 14]])
对于高维数组,tranpose需要得到一个由轴编号组成的元组才能对这些轴进行转置,太费脑子:
arr = np.arange(16).reshape((2,2,4))arr
#array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],[12, 13, 14, 15]]])
arr.transpose((1,0,2))#array([[[ 0, 1, 2, 3],[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],[12, 13, 14, 15]]])
还可以使用swapaxes函数进行转置,它接受一对轴编号:
数组函数
通用函数:元素级数组函数
通用函数中,有一元的函数,如abs,sqrt,square,exp,log等等,也有二元的函数maximum、minimum等等,这些都比较简单,我们举两个例子即可:
arr = np.arange(10)np.sqrt(arr)
x = np.random.randn(8)y = np.random.randn(8)np.maximum(x,y)#array([ 0.68417031, 0.22971426, 1.69724546, 1.19366822, -0.79176777, -0.43557768, 0.66628223, 0.85093113])
where函数
where函数,三个参数,条件,条件为真时选择值的数组,条件为假时选择值的数组:
xarr = np.array([1.1,1.2,1.3,1.4,1.5])yarr = np.array([2.1,2.2,2.3,2.4,2.5])cond = np.array([True,False,True,True,False])np.where(cond,xarr,yarr)
输出为:
array([ 1.1, 2.2, 1.3, 1.4, 2.5])
也可以使用下面的形式,后两个参数为指定值:
np.where(xarr>1.2,2,-2)#array([-2, -2, 2, 2, 2])
数学和统计方法
数学和统计方法既可以当作数组的实例方法调用,也可以当作顶级numpy函数调用,比如下面两种计算数组均值的方法是等效的:
arr = np.random.randn(5,4)arr.mean()np.mean(arr)
mean或sum这一类函数可以接受一个axis参数,用于计算该轴向上的统计值,最终结果是一个少一维的数组。对于一个二维数组,axis=0相当于按列操作,最终元素的个数和第二维的大小相同,axis=1相当于按行操作,最终元素的个数和第一维的大小相同:
arr.mean(axis=1)#array([ 0.29250253, -0.50119163, 0.11746254, 0.23338843, 0.15912472])
arr.sum(0)#array([ 1.92728592, 0.67480797, -2.8398905 , 1.44294295])
我们也可以用cumsum(累加值计算)和cumprod(累积值计算)保留中间计算结果:
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])arr.cumsum(0)
#array([[ 1, 2, 3],[ 5, 7, 9],[12, 15, 18]])
arr.cumprod(1)#array([[ 1, 2, 6],[ 4, 20, 120],[ 7, 56, 504]])
排序方法
np中还提供了排序方法,排序方法是就地排序,即直接改变原数组:
arr = np.random.randn(8)arr#array([-0.85668922, -2.0049649 , -0.89885165, -0.04185277, 0.73736138,-0.03509021, -1.89745107, -2.36576122])
arr.sort()arr#array([-2.36576122, -2.0049649 , -1.89745107, -0.89885165, -0.85668922,-0.04185277, -0.03509021, 0.73736138])
集合运算函数
unique计算x中的唯一元素,并返回有序结果
arr = np.array([1,3,2,5,2,4,2,2,1,4,5,2])np.unique(arr)#array([1, 2, 3, 4, 5])
numpy提供了下面三个常见的集合运算函数:
intersect1d(x,y) 用于计算x和y的公共结果,并返回有序结果
union1d(x,y) 用于计算x和y的并集,并返回有序结果
setdiff1d(x,y),集合的差,即元素在x中不在y中
x = np.array([1,2,4,5])y = np.array([3,4,5])np.intersect1d(x,y)#array([4, 5])np.union1d(x,y)#array([1, 2, 3, 4, 5])np.setdiff1d(x,y)#array([1, 2])
线性代数
numpy还提供了许多线性代数运算的函数,比如计算矩阵的乘积:
#矩阵的乘积x = np.array([[1,2,3],[4,5,6]])y = np.array([[6,23],[-1,7],[8,9]])np.dot(x,y)
下面可以计算矩阵的逆、行列式、特征值和特征向量、qr分解值,svd分解值:
#计算矩阵的逆from numpy.linalg import inv,det,eig,qr,svdt = np.array([[1,2,3],[2,3,4],[4,5,6]])inv(t)
#计算矩阵行列式det(t)
#计算QR分解址qr(t)
#计算奇异值分解值svdsvd(t)
#计算特征值和特征向量eig(t)
原文链接:https://mp.weixin.qq.com/s?__biz=MzI1MzY0MzE4Mg==&mid=2247483776&idx=1&sn=e33b99bcaaf78123ae86658131764f16&chksm=e9d01141dea79857a2a02104d37dc7ef63069ab6abb679b56560763b6449bcda2cf1e8e2b25e&scene=21#wechat_redirect
查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:
www.leadai.org
请关注人工智能LeadAI公众号,查看更多专业文章
大家都在看
LSTM模型在问答系统中的应用
基于TensorFlow的神经网络解决用户流失概览问题
最全常见算法工程师面试题目整理(一)
最全常见算法工程师面试题目整理(二)
TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络
装饰器 | Python高级编程
今天不如来复习下Python基础
Numpy基础知识点汇总相关推荐
- java基础知识大全,java 基础知识点汇总
java 基础知识点汇总 问题一:我声明了什么! String s = "Hello world!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个Strin ...
- C语言基础知识点汇总(一)
C语言基础知识点汇总(一) 1.读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数. 2.程序中基本的控制结构是三种: 顺序结构 .选择 ...
- C语言基础知识点汇总(1)
C语言基础知识点汇总(1) 1.读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数. 2.程序中基本的控制结构是三种: 顺序结构 .选择 ...
- 计算机基础知识点文库,计算机基础知识点汇总.doc
计算机基础知识点汇总.doc (19页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 一-.基础操作1. 在中文Windows中,使用软键 ...
- Python小记:14.数据分析基础知识点汇总
目录: 数据分析 numpy概述 numpy`历史` numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 ndarray数组对象的 ...
- Python零基础入门,纯干货!【Python基础知识点汇总整理】
目录 第一章 认识Python.Python常用集成开发环境PyCharm 一.认识 Python 01. Python 的起源 1.2 Python 的设计目标 1.3 Python 的设计哲学 0 ...
- SQL语句快速回忆——SQL基础知识点汇总
文章目录 DDL 建表 约束 已经建了表要添加约束 取消主键PRIMARY约束 外键 FOREIGN KEY 建表时加外键(表2必须已经创建,并且建表时列名已经定义) 已有表添加外键约束 删除外键约束 ...
- 2022最新网络安全基础知识点汇总
一.网络安全概述 1.1 定义 信息安全:为数据处理系统建立和采用的技术和管理的安全保护,保护计算机硬件.软件和数据不因偶然和恶意的原因遭到破坏.更改和泄露. 网络安全: 防止未授权的用户访问信息 防 ...
- 微信小程序开发,基础知识点汇总详解
目录 一.目录中文件说明 1.app.js文件 2.project.config.json文件 3.sitemap.json文件 4.页面中的.json文件 5.如何创建小程序页面 二.微信中代码的格 ...
最新文章
- windows下实现Git在局域网使用
- opencv实现正交匹配追踪算法OMP
- 2021年高薪城市排名,数据盘点哪些城市对打工人最友好?
- 岗位内推 | 微软亚洲互联网工程院自然语言处理组招聘算法研究实习生
- Faster-Rcnn的loss曲线可视化
- 组合模式_[设计模式]10.组合模式
- 演练:创建和使用静态库 (C++)
- Linux文件和目录权限
- MVC的WebApi中开启Session会话支持
- MySQL循环结构例题_Mysql:循环结构
- android+实时ping工具,安卓ping测试工具
- catia二次开发:函数
- 《帝国时代III黄金版》宣布
- 人工智能专业计算机毕业设计选题推荐
- 【隧道应用-3】Cobalt Strike正向连接多层内网
- JS函数的参数(arguments)的使用
- [SSPU新生赛2019]Coda的题解集
- 自增主键用完了怎么办?
- 摆平Win2008与VPC2007的诡异冲突
- matlab中通过pcwrite将xyz数据转换成pcd格式文件
热门文章
- 优先级调度算法实现_React17新特性:启发式更新算法
- python中什么是链表_python中的数据结构-链表
- Java程序中fix time_Java Position.setFixTime方法代码示例
- dz去掉/forum.php_discuz如何去除url的forum.php
- python爬取2019年计算机就业_2019年最新Python爬取腾讯招聘网信息代码解析
- Teamviewer 手机端怎么使用右键-已解决
- BZOJ 3626 LCA(离线+树链剖分+差分)
- jquery 全选获取值
- iOS开发多线程-RunLoop
- 空间平面,空间直线及它们的方程