2017-09-08 8 views
3

私は本当に大きな数字の配列(145000行* 550 cols)を持っています。そして、私はサブアレイ内にローリングスライスを作りたいと思っていました。私はそれを関数で実装しようとしました。期待通りに機能lagged_vals振る舞うだけに、私はそれを望むようにnp.lib.stride_tricks動作しません - どのように私はnp.lib.stride_tricks実装では、その特定の行を削除するにはnumpyのストライドはサブアレイ内でのみストライドできますか?

def lagged_vals(series,l): 
# Garbage implementation but still right 
    return np.concatenate([[x[i:i+l] for i in range(x.shape[0]) if i+l <= x.shape[0]] for x in series] 
          ,axis = 0) 

# Sample 2D numpy array 
something = np.array([[1,2,2,3],[2,2,3,3]]) 
lagged_vals(something,2) # Works as expected 

# array([[1, 2], 
#  [2, 2], 
#  [2, 3], 
#  [2, 2], 
#  [2, 3], 
#  [3, 3]]) 


np.lib.stride_tricks.as_strided(something, 
           (something.shape[0]*something.shape[1],2), 
           (8,8)) 

# array([[1, 2], 
#  [2, 2], 
#  [2, 3], 
#  [3, 2], <--- across subarray stride, which I do not want 
#  [2, 2], 
#  [2, 3], 
#  [3, 3]) 

?そして、どのように私は大きな配列のためにこのクロス配列のストライド除去をスケールすることができますか?

+0

、あなたはそれらの進歩の3D出力で大丈夫だろうか、あなたがする必要がありますか2D出力ですか? – Divakar

答えて

2

確かに、それはnp.lib.stride_tricks.as_stridedで可能です。

from numpy.lib.stride_tricks import as_strided 

L = 2 # window length 
shp = a.shape 
strd = a.strides 

out_shp = shp[0],shp[1]-L+1,L 
out_strd = strd + (strd[1],) 

out = as_strided(a, out_shp, out_strd).reshape(-1,L) 

サンプル入力、出力 - - 力を再形成する最後のステップは、それがそこにコピーを作成すること

In [177]: a 
Out[177]: 
array([[0, 1, 2, 3], 
     [4, 5, 6, 7]]) 

In [178]: out 
Out[178]: 
array([[0, 1], 
     [1, 2], 
     [2, 3], 
     [4, 5], 
     [5, 6], 
     [6, 7]]) 

注ここでは一つの方法です。しかし、最終的な出力が2Dである必要があれば、それは回避できません。我々は3D出力と大丈夫であれば、そのリシェイプをスキップし、これviewを達成するため、サンプルケースに示すように - そう

In [181]: np.shares_memory(a, out) 
Out[181]: False 

In [182]: as_strided(a, out_shp, out_strd) 
Out[182]: 
array([[[0, 1], 
     [1, 2], 
     [2, 3]], 

     [[4, 5], 
     [5, 6], 
     [6, 7]]]) 

In [183]: np.shares_memory(a, as_strided(a, out_shp, out_strd)) 
Out[183]: True 
+0

ありがとう!テストされupvoted!乾杯!!私はそれが2Dであることを好む。 –

関連する問題