繁体   English   中英

使用numpy时,最快的方法是从-n到n生成一个数组(不包括0),即n为整数?

[英]With numpy, what's the fastest way to generate an array from -n to n, excluding 0, being `n` an integer?

使用numpy时,最快的方法是从-n到n生成数组(不包括0, n为整数),最快的方法是什么?

遵循一种解决方案,但是我不确定这是最快的:

n = 100000
np.concatenate((np.arange(-n, 0), np.arange(1, n+1)))

另一种方法是创建-n到n-1的范围。 然后将零加到1。

def non_zero_range(n):
    # The 2nd argument to np.arange is exclusive so it should be n and not n-1
    a=np.arange(-n,n)
    a[n:]+=1
    return a

n=1000000
%timeit np.concatenate((np.arange(-n,0), np.arange(1,n+1)))
# 4.28 ms ± 9.46 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit non_zero_range(n)
# 2.84 ms ± 13.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

我认为减少响应时间是由于仅创建一个数组,而不是串联方法中的三个。

编辑

感谢大家。 我编辑了帖子并更新了新的考试时间。

有趣的问题。

实验

我在jupyter笔记本中做到了。 他们都使用了numpy API。 您可以自己进行以下代码的实验。

关于jupyter-notebook中的时间测量,请参阅: 在ipython Notebook中测量单元执行时间的简单方法

原始np.concatenate

%%timeit 
n = 100000
t = np.concatenate((np.arange(-n, 0), np.arange(1, n+1)))

#175 µs ± 2.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Sol 1. np.delete

%%timeit 
n = 100000
a = np.arange(-n, n+1)
b = np.delete(a, n)

# 179 µs ± 5.66 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Sol 2.列表理解+ np.arrary

%%timeit
c = np.array([x for x in range(-n, n+1) if x != 0])

# 16.6 ms ± 693 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

结论

原始解决方案和解决方案1之间没有太大区别,但是解决方案2在这三个解决方案中最差。 我也在寻找更快的解决方案。

参考

对于那些是:

有兴趣初始化并填充一个numpy数组

感到困惑的is vs ==

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM