我目前正在寻找一种类似于np.arange
的方法,但具有加倍步长的选项。
我知道np.arange
创建均匀间隔的数组,并不支持可变步长。
我想要的输出结果类似于np.array([0,1,3,7,15,31,...])
。
是否有任何内置的函数可以实现这个功能?
我必须经常使用它,因此希望避免使用for循环或类似的缓慢方法。
尝试:
2 ** np.arange(0,10,1) - 1
尝试这个答案
Numpy的arange()
函数直接是一个静态步进函数。我们可以稍微自定义一下,以获得所需的数组np.array([0, 1, 3, 7, 15, 31, ...])
n = 10 #number of elements
2**np.arange(0, n, 1)-1 #range function
这也可以提供某些结果。这段代码比其他 for 循环
方法要简单得多。
比较结果
像这样使用 for 循环创建数组在处理上比其他方法更有效率。
import timeit
print(timeit.timeit(f'np.array([2**i-1 for i in range(10)])', setup='import numpy as np'))
# 3.5182215999811888
print(timeit.timeit(f'np.fromiter((2**i-1 for i in range(10)), int)', setup='import numpy as np'))
# 3.74799029994756
print(timeit.timeit(f'2 ** np.arange(0,10,1) - 1', setup='import numpy as np'))
# 4.791339100105688
希望你找到了最好的答案 :)
numpy
的解决方案比将列表推导式转换要快大约 1.8 倍(使用更公正的np.arange(10)
比较)。 - Michael Szczesny