【问题标题】: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”一个整数?
【发布时间】: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,请查看我的帖子。如果喜欢,请给我点赞

标签: python numpy


【解决方案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)

我认为缩短响应时间是因为只创建一个数组,而不是像串联方法中那样创建三个。

【讨论】:

  • 同意;对于像这样的简单操作,就 numpy 性能而言,最大限度地减少临时变量就是它的全部意义所在。
  • 感谢分享
【解决方案2】:

编辑

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

有趣的问题。

实验

我是在我的 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)

溶胶 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== 感到困惑

【讨论】:

  • 不过,不需要反对票。如果您觉得他的证明可能缺少,请指出缺少的内容。我看不出有什么本质上的错误。
  • @kerwei:我想你误解了。这个答案只是计时语句 n = 100000。数组创建不定时。
  • @WeiYuangHsu 感谢编辑,但我不相信时间已经更新。
  • 看来时间问题已经解决了。
  • 旁注,if x is not 0 不是比较整数的正确方法。 is 不能替代 ==。使用if x != 0 或简单地使用if x
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多