[学习笔记] NumPy走一趟(持续更)
Numpy学习笔记
之前没有花时间去专门学Numpy,都是用到什么就草草查一下,最近在学DeepLearning,就决定还是系统地把Numpy学一遍。
一.Numpy基础篇
https://www.runoob.com/numpy/numpy-tutorial.html
大部分跟着菜鸟教程这个网站学的,上面有的基础知识点就不赘述了,只写一些值得特别注意的or没见过用法or自己的理解。
1.dtype(数据类型对象)
dt = np.dtype(np.int32) #或np.dtype("i4")
print(dt)
#输出结果:int32
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
print(student)
#输出结果:
#[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print(a)
#输出结果:
#[('abc', 21, 50.0), ('xyz', 18, 75.0)]
这个用法很像C语言里的结构体,先用np.dtype定义一个结构体里面的属性,然后用np.array实例化出很多对象,存在一个numpy数组里。
简单来说:创建了一个numpy-array数组,其中每个元素类型为之前定义好的dtype='student'。
2.ndarray.itemsize
ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。
# 数组的 dtype 为 int8(一个字节)
x = np.array([1,2,3,4,5], dtype = np.int8)
print (x.itemsize) #1
# 数组的 dtype 现在为 float64(八个字节)
y = np.array([1,2,3,4,5], dtype = np.float64)
print (y.itemsize) #8
3.numpy.arange
numpy.arange(start=0, stop, step=1, dtype)
(1)default:start=0,可以只传一参数这样用(结果为从0开始的n个数字):
x = np.arange(5)
print (x) #[0 1 2 3 4]
(2)stop不包含:再借用数学”黑话“,[start, stop) 是一个左闭右开区间。
(3)dtype:如果没有显示指定,则会使用输入数据的类型
4.numpy.linspace
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
默认包含stop
参数 | 描述 |
---|---|
stop | 序列的终止值,如果endpoint为true,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为 ture 时,数列中中包含stop值,反之不包含,默认是True |
retstep | 如果为 True 时,生成的数组中会显示间距,反之不显示 |
a = np.linspace(1,10,10,retstep='true')
print(a)
#(array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), 1.0)
5.numpy.logspace
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
start:始于base的start次方
stop:终于base的stop次方
a = np.logspace(1,3,num=10)
print(a)
#array([ 10. , 16.68100537, 27.82559402, 46.41588834,
# 77.42636827, 129.1549665 , 215.443469 , 359.38136638,
# 599.48425032, 1000. ])
a = np.logspace(0,8,9,base=2)
print(a)
#array([ 1., 2., 4., 8., 16., 32., 64., 128., 256.])
6.Numpy索引共享空间
a = np.arange(1,5)
print(a) #[1 2 3 4]
b = a[1:3]
print(b) #[2 3]
a[1]=999
print(b) #[999 3]
7.Numpy高级索引
7.1整数数组索引
获取数组中(0,0),(1,1)和(2,0)位置处的元素
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y) #[1 4 5]
numpy数组也可做索引
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
#array([[ 0, 2],
# [ 9, 11]])
7.2布尔索引
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print (x)
#[[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
print (x[x > 5])
#[ 6 7 8 9 10 11]
7.3花式索引
花式索引不共享空间!而是将数据复制到新数组中
(1)传入索引数组
a = np.arange(32).reshape([8,4])
print(a)
#[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]
# [12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]
# [24 25 26 27]
# [28 29 30 31]]
b = a[ [4,2,1,7] ]
print(b)
# [[16 17 18 19]
# [ 8 9 10 11]
# [ 4 5 6 7]
# [28 29 30 31]]
(2)传入多个索引数组(用np.ix_)
a[np.ix_([1,3],[2,5])]
返回数组 :
[[a[1,2] a[1,5]], [a[3,2] a[3,5]]]
np.ix_:
得到两个数组的笛卡尔积
内部实际工作机制:
a = np.ix_([1,2,3],[4,5,6])
print(a)
# (array([[1],
# [2],
# [3]]), array([[4, 5, 6]]))
如果没有用np.ix_就变成了7.1 (1)中的数组索引,只返回a[1,4],a[2.5],a[3,6]组成的数组。
8.numpy.nditer
迭代对象numpy.nditer可以逐个访问数组元素
a = np.arange(6).reshape(2,3)
print(a) # array([[0, 1, 2],
# [3, 4, 5]])
for x in np.nditer(a):
print(x,end=",") # 0,1,2,3,4,5,
for x in np.nditer(a,order='F'):
print(x,end=",")
# 0,3,1,4,2,5,
迭代访问的顺序并不是C-order(行优先),而是和数组内存布局一致,这样做是为了提升访问的效率。
b = np.asarray(a,order='F')
print(b)
# array([[0, 1, 2],
# [3, 4, 5]])
for x in np.nditer(b):
print(x,end=",")
# 0,3,1,4,2,5,
关于转置在内存中的顺序:
c = a.T
print(c)
#[[0 3]
# [1 4]
# [2 5]]
for x in np.nditer(c):
print(x,end=",")
# 0,1,2,3,4,5,
d = a.T.copy()
print(d)
#[[0 3]
# [1 4]
# [2 5]]
for x in np.nditer(d):
print(x,end=",")
# 0,3,1,4,2,5,
另外c = a.T与a共享内存,而d = a.T.copy()真正的复制了一个矩阵。改变a的值,c会随之改变(反之,改c时a也会被改),而d不会改变。
若在遍历过程中想修改元素值:
for x in np.nditer(a, op_flags=['readwrite']):
#或
for x in np.nditer(a, op_flags=['write-only']):
#默认值 op_flags=read-only
二.函数艳遇篇
人们说,艳遇总是美好而短暂的,记录学习之旅中与各位函数的邂逅,想在脑海里留下些你们面容的残枝掠影~
行了,演不下去了,就是记点遇到的函数。
1.np.loadtxt()
作用:从.txt文件中读取数据存为数组。
M = np.loadtxt("test.txt")
#test.txt内容为:
#1 2 3
#4 5 6
print(M)
#[[1. 2. 3.]
# [4. 5. 6.]]
loadtxt自动处理换行符
M = np.loadtxt("test2.txt",delimiter=',')
#test2.txt内容为:
#1,2,3
#4,5,6
print(M)
#[[1. 2. 3.]
# [4. 5. 6.]]
delimiter指定.txt文件中元素的间隔符,默认为空格。当间隔符不是空格时必须显示指定。
2.numpy.nonzero
返回非零索引值
x = np.array([1,2,0,0,3,0,5])
np.nonzero(x)
#(array([0, 1, 4, 6]),)
3.numpy.tile
就是把数组”平铺“得到新数组,这里讲的很明白:
https://blog.csdn.net/qq_18433441/article/details/54897250
三.实战技巧篇
1.乾坤大挪移(逆序数组...)
a = np.arange(5)
b = a[::-1]
print(a) #[0 1 2 3 4]
print(b) #[4 3 2 1 0]
a = np.arange(6).reshape(2,3)
b = a[::-1]
c = a[:,::-1]
d = a[::-1,::-1]
print(a)
print(b)
print(c)
print(d)
# [[0 1 2]
# [3 4 5]]
# [[3 4 5]
# [0 1 2]]
# [[2 1 0]
# [5 4 3]]
# [[5 4 3]
# [2 1 0]]
2.计算索引:numpy.unravel_index(indices, dims, order='C')
求第n个元素在数组中的(多维结构)索引。
也就是,已知平铺后的一维索引,求原多维结构的索引。
#求在7×8×9的多维数组中,第100个元素的索引
print(np.unravel_index(100,[7,8,9]))
#(1, 3, 1)
例如,常常这样用:
a = np.random.random([3,4])
a_max = a.argmax()
print(a)
print(a_max)
print(np.unravel_index(a_max,a.shape))
# [[0.32974103 0.62543059 0.5068712 0.20391591]
# [0.24423194 0.24260907 0.40326733 0.31111273]
# [0.28750882 0.67934444 0.5857911 0.67283181]]
# 9
# (2, 1)
[学习笔记] NumPy走一趟(持续更)的更多相关文章
- [学习笔记] Numpy基础 系统学习
[学习笔记] Numpy基础 上专业选修<数据分析程序设计>课程,老师串讲了Numpy基础,边听边用jupyter敲了下--理解+笔记. 老师讲的很全很系统,有些点没有记录,在PPT里就不 ...
- [Python] Python学习笔记之常用模块总结[持续更新...]
作为一种极其简单的编程语言,Python目前成为了最炙手可热的几种语言之一.它不仅简单易学,而且它还为用户提供了各种各样的模块,功能强大,无所不能.有利必有弊,学习Python同样有困扰,其中之一就是 ...
- Catlike学习笔记(1.3)-使用Unity画更复杂的3D函数图像
第三篇来了-今天去参加了 Unite 2018 Berlin,感觉就是....非常困...回来以后稍微睡了下清醒了觉得是时候认真学习下了,不过讲的很多东西都是还没有发布或者只有 Preview 的版本 ...
- Dubbo入门到精通学习笔记(六):持续集成管理平台之Hudson 持续集成服务器的安装配置与使用
文章目录 安装Hudson 使用Hudson tips:自动化部署 附录:两个脚本 安装Hudson IP:192.168.4.221 8G 内存(Hudson 多个工程在同时构建的情况下比较耗内存) ...
- Dubbo入门到精通学习笔记(三):持续集成管理平台之SVN版本管理系统的安装和使用
文章目录 持续集成管理平台介绍 持续集成介绍 持续集成管理平台的组成 持续集成实践介绍 即将学习 SVN版本管理系统的安装 安装 Subversion + Apache 安装 jsvnadmin 简单 ...
- 深入理解C#学习笔记之走出误区
通过学习深入理解C#这本书,发现自己对于C#这门语言一直存在着三个误区. 第一个误区:结构是轻量级的类: 我一直认为值类型不应该具有方法或其他有意义的行为,它们只应该具有一些简单的属性.但书中总结了一 ...
- [学习笔记] numpy次成分分析和PCA降维
存个代码,以后参考. numpy次成分分析和PCA降维 SVD分解做次成分分析 原图: 次成分复原图: 代码: import numpy as np from numpy import linalg ...
- numpy学习笔记 - numpy数组的常见用法
# -*- coding: utf-8 -*- """ 主要记录代码,相关说明采用注释形势,供日常总结.查阅使用,不定时更新. Created on Mon Aug 20 ...
- numpy学习笔记 - numpy常用函数、向量化操作及基本数学统计方法
# -*- coding: utf-8 -*-"""主要记录代码,相关说明采用注释形势,供日常总结.查阅使用,不定时更新.Created on Fri Aug 24 19 ...
随机推荐
- Java中常用的url签名防篡改方法
实现方式:Md5(url+key) 的方式进行的. 1.key可以是任意的字符串,然后“客户端”和“服务器端”各自保留一份,千万不能外泄. 2.请求的URL 例如: name=lxl&age ...
- 错误处理之try、catch、finally中的return、throw执行顺序。
今天遇到一个让人无语的代码块 try { bilSheetService.syncUser(bilWebseviceLog, userId, optType); }catch (Exception e ...
- Prometheus 与 Grafana 集成
简介 Grafana 是一个可视化仪表盘,它拥有美观的图标和布局展示,功能齐全的仪表盘和图形编辑器,默认支持 CloudWatch.Graphite.Elasticsearch.InfluxDB.My ...
- spring源码深度解析— IOC 之 循环依赖处理
什么是循环依赖 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图所示: 注意,这里不是函数的循环调用,是对象的相互 ...
- idea创建springcloud主工程和springboot子项目
创建主工程,选择file-new-project,选择maven,直接next 填写GroupId包名,ArtifactId项目名,next-finish 创建子项目springboot,项目右击-n ...
- Docker-Compose搭建单体SkyWalking
SkyWalking简介 SkyWalking是一款高效的分布式链路追踪框架,对于处理分布式的调用链路的问题定位上有很大帮助 有以下特点: 性能好 针对单实例5000tps的应用,在全量采集的情况下, ...
- spring源码深度解析— IOC 之 bean 的初始化
一个 bean 经历了 createBeanInstance() 被创建出来,然后又经过一番属性注入,依赖处理,历经千辛万苦,千锤百炼,终于有点儿 bean 实例的样子,能堪大任了,只需要经历最后一步 ...
- linux命令积累
lsof -i: //根据端口号查相关信息 //杀进程 ps -ef|grep appName //根据进程名称查找相关信息 grep -r "关键词" 目录 //在制定目录下根据 ...
- mysql 安装使用
本节掌握内容: MySQL的介绍安装.启动 windows上制作服务 MySQL破解密码 MySQL中统一字符编码 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 O ...
- Web自动化测试 三 ----- DOM对象和元素查找
一.DOM对象 DOM(Document Object Model文档对象模型):将HTML的各种元素映射为JS可访问的对象.HTML文档中的所有内容都是节点,这些东西在HTML中我们称为元素. 整个 ...