1 ndarray VS python-list

  • Numpy 就是 C 的逻辑, 创建存储容器 Array 的时候是寻找内存上的一段连续空间来存放
  • Python 存放的时候则是不连续的区域(只是它用索引将这些区域联系起来了), 这使得 Python 在索引这个容器里的数据时不是那么有效率

2 View & Copy

Copy 顾名思义, 会将 Array 中的数据 copy 出来存放在内存中另一个地方

View 不 copy 数据, 而是给源数据加一个窗(视图),从外面看窗户里的数据。具体来说,view 不会新建数据,而只是在源数据上建立索引部分

df1经过view 之后得到的df2全部都是 df1的东西, 动 df2的任何地方, df1 都会受到牵扯, 因为他们在内存中的位置是一模一样的, 本质上就是自己。

而 df1经过copy 之后得到的df2则是将df1 copy 了一份, 然后把df2 放在内存中的另外的地方, 这样改变df2,df1 是不会被改变的.

2.1 示例比较view和copy的快慢

View 只是加了窗,不会复制东西, 速度快!

2.1.1 b=2*b  VS  b*=2

第一个是copy,第二个是view!

b=np.ones(5)
print(id(b))
b=b*2
print(id(b))
'''
1921309681504
1921309680624
'''
b=np.ones(5)
print(id(b))
b*=2
print(id(b))
'''
1921285077472
1921285077472
'''

2.1.2 比较时间

import time
t1=time.time()
b=np.ones(1000)
for i in range(1000):b=b*2
t2=time.time()
print(t2-t1)
#0.0029931068420410156
b=np.ones(1000)
t2=time.time()
for i in range(1000):b*=2
t3=time.time()
print(t3-t2)
#0.001993894577026367

可以看到 view比copy用时要少一些

2.2 示例比较flatten和ravel的快慢

在python包介绍:numpy_UQI-LIUWJ的博客-CSDN博客 中,提到了flatten和ravel

flatten返回一份数据拷贝,对拷贝所做的修改不影响原始数组

ravel和flatten差不多,唯一的区别是,修改会影响原始数组

也就是说,flatten是拷贝,ravel是视图

import time
t1=time.time()
b=np.ones(1000)
for i in range(1000):b.flatten()
t2=time.time()
print(t2-t1)
#0.0009980201721191406b=np.ones(1000)
t2=time.time()
for i in range(1000):b.ravel()
t3=time.time()
print(t3-t2)
#0.0009784698486328125

也看得出来,ravel(view)的运行速度比flatten(copy)要快一些

2.3 总结 哪些是view哪些是copy

view copy

切片操作 (切片索引不涉及列表)

a[1:2, 3:6]
a_view2 = a[:100]
a_view3 = a[::2]

切片操作,切片索引涉及列表

a[[1,4,6], [2,4,6]] 
a[[1,2], :]

布尔索引

a[a[1,:] != 0, :] 
a[np.isnan(a[:,0]), :]
 a[[True, True], [False, True]]
 a.ravel()
a.flatten()
 b*=2
b=2*b 

2.4 涉及列表的索引的加速方法——np.take

如果用 index 来选数据, 像 a[[1,4,6], [2,4,6]], 用 take 在大部分情况中会快一些

np.take(ndarray,index_lst)

import time
b=np.ones(100).reshape(10,10)
t1=time.time()
for i in range(1000):b[[1,2,3,4],[5,6,7,8]]
t2=time.time()
print(t2-t1)
#0.0069811344146728516b=np.ones(100).reshape(10,10)
lst=[[1,2,3,4],[5,6,7,8]]
t2=time.time()
for i in range(1000):np.take(b,lst)
t3=time.time()
print(t3-t2)
#0.005984067916870117

参考内容 对速度有洁癖?快来了解 Numpy 的 View 与 Copy - Numpy 数据怪兽 | 莫烦Python (mofanpy.com)

numpy 笔记 view,copy和numpy的运行速度相关推荐

  1. NumPy 笔记(超级全!收藏√)

    文章目录 NumPy 教程 NumPy Ndarray 对象 NumPy 数据类型 数据类型对象 (dtype) NumPy 读取数据 NumPy 数组属性 ndarray.ndim ndarray. ...

  2. numpy 笔记: random模块

    1 基本应用 randint 随机生成大小为size的正整数ndarray low.high.size三个参数.默认high是None,如果只有low,那范围就是[0,low).如果有high,范围就 ...

  3. 学习笔记27—python中numpy.ravel() 和 flatten()函数

    简介 首先声明两者所要实现的功能是一致的(将多维数组降位一维).这点从两个单词的意也可以看出来,ravel(散开,解开),flatten(变平).两者的区别在于返回拷贝(copy)还是返回视图(vie ...

  4. Python学习笔记第四十八天(NumPy 矩阵库(Matrix))

    Python学习笔记第四十八天 NumPy 矩阵库(Matrix) 转置矩阵 matlib.empty() numpy.matlib.ones() numpy.matlib.eye() numpy.m ...

  5. python科学计算笔记(一)NumPy中ndarray对象、ufunc运算、矩阵运算

    标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针.这样为了保存一个简单的[1,2,3],需要有3个指针和三个 ...

  6. [转载] python numpy 笔记(一)

    参考链接: Python中的numpy.greater_equal numpy basic 1.Write a NumPy program to get the numpy version and s ...

  7. 机器学习笔记(一)numpy的使用、机器学习基础概念

    目录 1.numpy 1.1.创建 numpy.array 1.1.1.常规创建 numpy.array 的方法 1.1.2.其他创建 numpy.array 的方法 1.1.2.其他创建随机数 ra ...

  8. 01_NumPy介绍,什么是NumPy,Python应用、(NumPy、SciPy、Matplotlib相关网址)--来自菜鸟和NumPy中文网

    转自:https://www.runoob.com/numpy/numpy-tutorial.html https://www.numpy.org.cn/article/basics/understa ...

  9. python【Numpy科学计算库】Numpy的超实用基础详细教程(看不懂你来打我)

    文章目录 Numpy简单介绍 1.Numpy是什么 2. 多维数组 numpy数据类型设定与转换 numpy索引与切片 多维数组索引.切片 数组文件输入输出 使用numpy.arange方法 使用nu ...

最新文章

  1. 大厂面试官必问的Mysql锁机制
  2. python笔试题110题_《Python程序设计》试题库
  3. 全球第二大浏览器升级!内存/CPU占用暴降
  4. c++可达矩阵及连通性_3.9秒破百,矩阵式LED大灯加持,这台国产车可真香
  5. 【git下载安装与配置】
  6. 計算機二級-java07
  7. c/c++ 中文件路径的表示
  8. 30个类仿真手写spring框架V2.0版本
  9. 什么年代了,买硬盘不论T?
  10. 如何用Latex写一篇小论文
  11. 日系P2P原理探究(二) — Winny, 日本崛起
  12. 2020.10.25丨全长转录组结构分析之可变剪切、lncRNA预测
  13. [LeetCode] 969. 煎饼排序
  14. iOS 接入 招商 一网通的 各种坑
  15. 市面上最适合跑步用的耳机有哪些、分享五款最优秀的跑步耳机
  16. 利用autojs制作抢购支付宝消费劵的手机脚本
  17. 红外遥控器添加遥控支持方法
  18. 欧姆龙SYSMAC STUDIO如何与基恩士DL-EP1进行EIP通信
  19. qq邮箱怎么添加学校邮箱
  20. Linux内核(2)——子系统

热门文章

  1. 【编程之外】为什么我们要写技术博客?
  2. 《Adobe Photoshop大师班:经典作品与完美技巧赏析》—Alexander Corvus
  3. 《JAVA编程思想》学习笔记——第三章 操作符
  4. Unity UGUI —— 无限循环List(转载)
  5. v-show和v-if的区别
  6. codeforces 665B Shopping
  7. 两款高性能并行计算引擎Storm和Spark比较
  8. Converting slapd.conf to a Directory Based Configu
  9. bugfree3.0.2版本升级--更新版
  10. 我的Windows Vista™也装好了...