【问题标题】:Fastest way to mix arrays in numpy?在 numpy 中混合数组的最快方法?
【发布时间】:2014-10-12 13:04:08
【问题描述】:
a= array([1,3,5,7,9])
b= array([2,4,6,8,10])

我想混合一对数组,以便它们的序列逐个元素地插入 示例:使用 a 和 b,它应该导致

c= array([1,2,3,4,5,6,7,8,9,10])

我需要在数千个序列上使用成对的长数组(超过一百个元素)来做到这一点。有比在每个数组上逐个元素腌制更聪明的想法吗? 谢谢

【问题讨论】:

    标签: python arrays performance numpy


    【解决方案1】:
    c = np.empty(len(a)+len(b), dtype=a.dtype)
    c[::2] = a
    c[1::2] = b
    

    (假设ab 具有相同的dtype。)

    你问的是最快的,所以这里做个时序对比(vstackravelempty都是numpy函数):

    In [40]: a = np.random.randint(0, 10, size=150)
    
    In [41]: b = np.random.randint(0, 10, size=150)
    
    In [42]: %timeit vstack((a,b)).T.flatten()
    100000 loops, best of 3: 5.6 µs per loop
    
    In [43]: %timeit ravel([a, b], order='F')
    100000 loops, best of 3: 3.1 µs per loop
    
    In [44]: %timeit c = empty(len(a)+len(b), dtype=a.dtype); c[::2] = a; c[1::2] = b
    1000000 loops, best of 3: 1.94 µs per loop
    

    使用vstack((a,b)).T.flatten(),复制ab创建vstack((a,b)),然后通过flatten()方法再次复制数据。

    ravel([a, b], order='F')实现为asarray([a, b]).ravel(order),需要复制ab,然后复制结果以创建order='F'的数组。 (如果你只做ravel([a, b]),它的速度和我的答案差不多,因为它不必再次复制数据。不幸的是,需要order='F' 来获得交替模式。)

    所以其他两种方法复制数据两次。在我的版本中,每个数组都被复制一次。

    【讨论】:

    • 我添加了一些可能有助于您的直觉的注释。
    【解决方案2】:

    这样就可以了:

    vstack((a,b)).T.flatten()
    
    array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
    

    【讨论】:

      【解决方案3】:

      使用numpy.ravel

      >>> np.ravel([a, b], order='F')
      array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
      

      【讨论】:

      • 非常感谢 falsetru,我所做的工作是为了感谢您的提议并得出结论!结果不直观,我不会赌f2!
      • @unutbu,感谢您指出这一点。删除了我无用的基准测试结果。
      • @sol,如果您想要最快的,请参阅 Warren Weckesser 的回答。实际上,随着数组大小的增长,我的速度越来越慢。
      • 一些想法为什么?这将导致我明天在工作中进行一次很好的讨论。你们大家!明天我会用真实数据对它们进行测试。
      猜你喜欢
      • 2015-07-27
      • 2019-08-14
      • 1970-01-01
      • 2021-11-11
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多