填充一维numpy数组的最快方法
我见过类似的问题,但没有一个直接解决这个问题。我测试了两种填充数组的方法,发现用np.zeros()的速度有时候更快,有时候直接填充又更快。请问有没有更好的方法?我对使用numpy数组还很陌生,开始用它是为了加快我的代码,但没太考虑可读性。
import numpy as np
import time
lis = range(100000)
timer = time.time()
list1 = np.array(lis)
print 'normal array creation', time.time() - timer, 'seconds'
timer = time.time()
list2 = np.zeros(len(lis))
list2.fill(lis)
print 'zero, fill - array creation', time.time() - timer, 'seconds'
谢谢
4 个回答
1
你的 list2
示例根本不管用——如果你检查一下 list2
,你会发现里面还是全是零。我觉得追求代码的可读性不仅仅是个好目标,这样做还能提高代码正确的可能性。
2
np.fromiter
这个函数如果你告诉它要生成多少个元素,它会提前分配好输出的数组空间。
a = [x/10. for x in range(100000)] # 10.3ms
np.fromiter(a, dtype=np.float) # 3.33ms
np.fromiter(a, dtype=np.float, count=100000) # 3.03ms
6
如果你有一个浮点数的列表,比如说 a=[x/10. for x in range(100000)]
,那么你可以用下面的方式来创建一个数组:
np.array(a) # 9.92ms
np.fromiter(a, dtype=np.float) # 5.19ms
但是你用的方法
list2 = np.zeros(len(lis))
list2.fill(lis)
不会按你想的那样工作。因为 .fill
是把整个数组都填充成一个值。