我见过类似的问题,但没有直接解决这个问题。 我有以下两种方法来填充数组,使用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'
谢谢
答案 0 :(得分:5)
如果您有一个浮点数列表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
用一个值填充整个数组。
答案 1 :(得分: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
答案 2 :(得分:1)
您的list2
示例根本不起作用 - 如果您检查list2
,您会发现它仍包含全零。我发现追求可读性不仅仅是一个好的目标。它还会增加正确代码的可能性。
答案 3 :(得分:1)
使用arange
numpy函数可以更快地创建第一个列表:
list3 = np.arange(100000)
您还可以找到有用的linspace
功能。