2016-07-26 32 views
3

我想將前n行作爲列添加到numpy數組。這裏有一個例子:將前n行作爲列添加到numpy數組

For n=2 this: 
[[ 1, 2] 
[ 3, 4] 
[ 5, 6] 
[ 7, 8] 
[ 9, 10] 
[11, 12]] 

Should be turned into this: 
[[ 1, 2, 0, 0, 0, 0] 
[ 3, 4, 1, 2, 0, 0] 
[ 5, 6, 3, 4, 1, 2] 
[ 7, 8, 5, 6, 3, 4] 
[ 9, 10, 7, 8, 5, 6] 
[11, 12, 9, 10, 7, 8]] 

任何想法我怎麼能做到這一點,而不打算在一個循環中整個陣列上。

回答

4

這裏有一個量化的方法 -

def vectorized_app(a,n): 
    M,N = a.shape 
    idx = np.arange(a.shape[0])[:,None] - np.arange(n+1) 
    out = a[idx.ravel(),:].reshape(-1,N*(n+1)) 
    out[N*(np.arange(1,M+1))[:,None] <= np.arange(N*(n+1))] = 0 
    return out 

採樣運行 -

In [255]: a 
Out[255]: 
array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12], 
     [13, 14, 15], 
     [16, 17, 18]]) 

In [256]: vectorized_app(a,3) 
Out[256]: 
array([[ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 4, 5, 6, 1, 2, 3, 0, 0, 0, 0, 0, 0], 
     [ 7, 8, 9, 4, 5, 6, 1, 2, 3, 0, 0, 0], 
     [10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3], 
     [13, 14, 15, 10, 11, 12, 7, 8, 9, 4, 5, 6], 
     [16, 17, 18, 13, 14, 15, 10, 11, 12, 7, 8, 9]]) 

運行時測試 -

我時序@Psidom's loop-comprehension based method並在100x放大版本在這篇文章中列出的矢量化方法(在大小方面)張貼在討論的樣品的:

In [246]: a = np.random.randint(0,9,(600,200)) 

In [247]: n = 200 

In [248]: %timeit np.column_stack(mypad(a, i) for i in range(n + 1)) 
1 loops, best of 3: 748 ms per loop 

In [249]: %timeit vectorized_app(a,n) 
1 loops, best of 3: 224 ms per loop 
1

這裏有一個方法來墊0在數組的開始,然後柱堆疊起來:

import numpy as np 
n = 2 
def mypad(myArr, n): 
    if n == 0: 
     return myArr 
    else: 
     return np.pad(myArr, ((n,0), (0,0)), mode = "constant")[:-n] 

np.column_stack(mypad(arr, i) for i in range(n + 1)) 

# array([[ 1, 2, 0, 0, 0, 0], 
#  [ 3, 4, 1, 2, 0, 0], 
#  [ 5, 6, 3, 4, 1, 2], 
#  [ 7, 8, 5, 6, 3, 4], 
#  [ 9, 10, 7, 8, 5, 6], 
#  [11, 12, 9, 10, 7, 8]])