2017-09-08 8 views
3

나는 정말 큰 숫자의 배열 (145000 rows * 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로 선호한다. –