python 二维数组遍历,python遍历多维数组
本文主要介绍python中Numpy二维数组遍历和切片后二维数组遍历的效率比较。在python-numpy中,可以使用双层for循环访问数组元素,也可以切片到每一行,遍历一维数组。这里有一个例子。有需要的朋友可以参考一下。
在使用python-numpy时,可以使用双层for循环来访问数组元素,或者切片到每一行并遍历一维数组。
代码如下:
将numpy作为np导入
导入时间
数量=160
a=np.random.random((NUM,NUM))
start=time.time()
对于范围(编号):内的I
对于范围(编号):内的j
如果a[i][j]==1.0:
及格
end1=time.time()
对于范围(编号):内的ii
b=a[ii,]
对于范围(编号):内的jj
如果b[jj]==1.0:
及格
end2=time.time()
打印(“结束1”,结束1-开始)
打印(“结束2”,结束2-结束1)
因为生成了[0,1]中的数字,所以这两个操作将遍历所有元素。多轮测试后,耗时如下:
当NUM为160时:
结束10 . 56861868686
end 2 0 . 54860 . 68868886861
当NUM为1600时:
end 1 0 . 14440 . 586585868685
end 2 0 . 54860 . 68868886861
结论:削球后穿越原因:的速度更快了。
楼主还不清楚。
一个想法:
b=a[ii,]
在numpy中,为了提高效率,切片后的子矩阵其实只是对原矩阵的引用,所以你改变子矩阵,原矩阵还是会改变。
所以在内部循环中,第二种方法是在内存中搜索该行中的元素所在的位置。第一种方法是先定位行,再定位列,所以很慢?
大家是怎么想的?
numba的速度在小数据量下比普通操作慢。
什么是numba?
数字迷情
实验比较:
将numpy作为np导入
导入时间
数量=160
从numba进口jit
a=np.random.random((NUM,NUM))
@jit(nopython=True)
定义功能1(a):
对于范围(编号):内的I
对于范围(编号):内的j
如果a[i][j]==1.0:
及格
定义功能2(a):
对于范围(编号):内的I
对于范围(编号):内的j
如果a[i][j]==1.0:
及格
@jit(nopython=True)
定义函数3(a):
对于范围(编号):内的ii
b=a[ii,]
对于范围(编号):内的jj
如果b[jj]==1.0:
及格
定义功能4(a):
适用于范围(编号):内的iii
b=a[iii,]
对于范围(编号):内的jjj
如果b[jjj]==1.0:
及格
start=time.time()
fun1(a)
end1=time.time()
fun2(a)
end2=time.time()
fun3(a)
end3=time.time()
fun4(a)
end4=time.time()
校长
t("end1",end1-start)
print("end2",end2-end1)
print("end3",end3-end2)
print("end4",end4-end3)
首先,当NUM为1600时,结果如下:
end1 0.2991981506347656 #无切片,有加速
end2 0.6372940540313721 #无切片,无加速
end3 0.08377814292907715 #有切片,有加速
end4 0.358079195022583 #有切片,无加速
其他条件相同的情况下,有切片的速度更快。同样,有numba加速的也比没加速的快。
但当NUM =160时,结果如下:
end1 0.29620814323425293 #无切片,有加速
end2 0.006980180740356445 #无切片,无加速
end3 0.08580684661865234 #有切片,有加速
end4 0.0029993057250976562 #有切片,无加速
有切片依旧比无切片的快。但是有numba加速的却比没有numba加速的慢。
原来@jit(nopython=True)只是对函数进行修饰,第一次调用会进行编译,编译成机器码,之后速度就会很快。
实验代码如下:
import numpy as npimport time
NUM = 160
from numba import jit
a=np.random.random((NUM,NUM))
@jit(nopython=True)
def fun1(a):
for i in range(NUM):
for j in range(NUM):
if a[i][j] == 1.0:
pass
def fun2(a):
for i in range(NUM):
for j in range(NUM):
if a[i][j] == 1.0:
pass
@jit(nopython=True)
def fun3(a):
for ii in range(NUM):
b = a[ii,:]
for jj in range(NUM):
if b[jj] == 1.0:
pass
def fun4(a):
for iii in range(NUM):
b = a[iii,:]
for jjj in range(NUM):
if b[jjj] == 1.0:
pass
for b in range(4):
start = time.time()
fun1(a)
end1 = time.time()
fun2(a)
end2 = time.time()
fun3(a)
end3 = time.time()
fun4(a)
end4 = time.time()
print("end1",end1-start)
print("end2",end2-end1)
print("end3",end3-end2)
print("end4",end4-end3)
print("---")
结果如下:
end1 0.29421305656433105
end2 0.0059833526611328125
end3 0.08181905746459961
end4 0.0029909610748291016
---
end1 0.0
end2 0.005949735641479492
end3 0.0
end4 0.004008769989013672
---
end1 0.0
end2 0.006977558135986328
end3 0.0
end4 0.00399017333984375
---
end1 0.0
end2 0.005974292755126953
end3 0.0
end4 0.003837108612060547
---
结论:
numba
加速时,第一次需要编译,需要耗时。之后调用就不需要了。
到此这篇关于python中的Numpy二维数组遍历与二维数组切片后遍历效率比较的文章就介绍到这了,更多相关Numpy二维数组遍历与二维数组切片后遍历效率比较内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。