【发布时间】:2019-07-23 02:09:24
【问题描述】:
使用 numpy,生成从 -n 到 n 的数组,不包括 0,为 n 整数的最快方法是什么?
遵循一种解决方案,但我不确定这是最快的:
n = 100000
np.concatenate((np.arange(-n, 0), np.arange(1, n+1)))
【问题讨论】:
-
嗨@gmagno,请查看我的帖子。如果喜欢,请给我点赞
使用 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-notebook 中完成的。他们都使用了numpy API。您可以自己进行以下代码的实验。
关于jupyter-notebook中的时间测量,请看:Simple way to measure cell execution time in 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)
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)
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 和 == 感到困惑
【讨论】:
n = 100000。数组创建不定时。
if x is not 0 不是比较整数的正确方法。 is 不能替代 ==。使用if x != 0 或简单地使用if x。