Python numpy中的复制matlab dyadup

Python numpy中的复制matlab dyadup,python,matlab,numpy,Python,Matlab,Numpy,我试图在numpy中复制Matlab中的dyadup函数。有没有比np.insert()更有效的方法 使用初始1024个元素的数组快速计时,我得出了每个循环14.2 usec的最佳时间,这还不错,但我想知道是否可以做得更好 谢谢 更有效的方法是: import numpy as np def dyadup(a, level=1, even=False): level += 1 start = 1 if even else 0 out = np.zeros(len(a)

我试图在numpy中复制Matlab中的dyadup函数。有没有比np.insert()更有效的方法

使用初始1024个元素的数组快速计时,我得出了每个循环14.2 usec的最佳时间,这还不错,但我想知道是否可以做得更好


谢谢

更有效的方法是:

import numpy as np

def dyadup(a, level=1, even=False):
    level += 1
    start = 1 if even else 0
    out = np.zeros(len(a) * level, dtype=a.dtype)
    out[start::level] = a
    return out

更多细节 让我把它分解一下

在python中(类似于Matlab),我们可以通过切片操作引用或提取某物的规则间隔项。例如:

In [1]: import numpy as np

In [2]: x = np.arange(10)

In [3]: x
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [4]: x[::2]
Out[4]: array([0, 2, 4, 6, 8])

In [5]: x[1::2]
Out[5]: array([1, 3, 5, 7, 9])

In [6]: x[1::3]
Out[6]: array([1, 4, 7])
In [5]: orig_dyadup(range(10), 3)
Out[5]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3,
       0, 0, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0])
我们还可以使用它将项目分配给数组:

In [7]: y = np.zeros(10)

In [8]: y
Out[8]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

In [9]: y[1::3] = 9

In [10]: y
Out[10]: array([ 0.,  9.,  0.,  0.,  9.,  0.,  0.,  9.,  0.,  0.])

In [11]: y[1::3] = 4, 5, 6

In [12]: y
Out[12]: array([ 0.,  4.,  0.,  0.,  5.,  0.,  0.,  6.,  0.,  0.])
因此,我们可以这样做:

In [13]: data = np.random.random(5)

In [14]: data
Out[14]: array([ 0.05458934,  0.97719278,  0.49670205,  0.87299456,  0.2223557 ])

In [15]: interleaved = np.zeros(len(data) * 2)

In [16]: interleaved[::2] = data

In [17]: interleaved
Out[17]: 
array([ 0.05458934,  0.        ,  0.97719278,  0.        ,  0.49670205,
        0.        ,  0.87299456,  0.        ,  0.2223557 ,  0.        ])
对于大型数组,这比使用
insert
要有效得多,因为
insert
将在每次调用时复制数组


时机 作为定时差的示例

In [2]: data = np.arange(10000)

In [3]: %timeit dyadup(data)
10000 loops, best of 3: 33 µs per loop

In [4]: %timeit orig_dyadup(data)
100 loops, best of 3: 2.21 ms per loop
请注意micro和mili。新的实现速度快了约100倍


进一步考虑 另外,注意不要修改您的输入。在python中,
x=a
不复制
a
x
是同一个对象,因此对
x
的任何修改也是对
a
的修改

在这种特定情况下,
np.insert
会制作一个副本,这样您就不会最终修改输入,但在其他情况下会这样做


最后一点,如果我正确理解了原始函数的意图,那么
级别
大于1就是不正确的

例如:

In [1]: import numpy as np

In [2]: x = np.arange(10)

In [3]: x
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [4]: x[::2]
Out[4]: array([0, 2, 4, 6, 8])

In [5]: x[1::2]
Out[5]: array([1, 3, 5, 7, 9])

In [6]: x[1::3]
Out[6]: array([1, 4, 7])
In [5]: orig_dyadup(range(10), 3)
Out[5]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3,
       0, 0, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0])
vs


之所以会出现这种差异,是因为您在迭代时修改了某些内容,但在插入时引用了原始项的索引。但是,我可能误解了您的意图。

一个更好的实现!谢谢