2017-05-22 4 views
0

2D 배열의 모든 부분 행렬을 가져와 각 부분 행렬에 대한 조작을 수행해야합니다. 그래서 예를 들어 행렬을 만들어 :numpy없이 2D 배열의 모든 서브 행렬을 얻는 방법은 무엇입니까?

나는 모든 서브 매트릭스를 얻을 때까지 3 행 3 열을 캡처 한 다음이 "창"을 이동해야하는
M3 = [list(range(5)) for i in range(6)] 
[[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4]] 

. 첫 번째 행렬은 다음과 같습니다

[[0, 1, 2], 
[0, 1, 2], 
[0, 1, 2]] 

마지막 하나는이 행렬

[[2, 3, 4], 
[2, 3, 4], 
[2, 3, 4]] 

나는 12 개 서브 매트릭스가 필요합니다. 그러나, 나는이 문제를 해결하기 위해 시도되는 코드를 사용하여 더 많은이 될 : 나는 18 얻을

for j in range(len(M3[0])-3): 
    for i in range(len(M3)-3): 
     for row in M3[0+j:3+j]: 
      X_i_j = [row[0+i:3+i] for row in M3[0+j:3+j]] 
      print(X_i_j) 

을하지만,하지 (12) (각 행렬의 두 중복 포함) :

[[0, 1, 2], [0, 1, 2], [0, 1, 2]] 
[[0, 1, 2], [0, 1, 2], [0, 1, 2]] 
[[0, 1, 2], [0, 1, 2], [0, 1, 2]] 
[[1, 2, 3], [1, 2, 3], [1, 2, 3]] 
[[1, 2, 3], [1, 2, 3], [1, 2, 3]] 
[[1, 2, 3], [1, 2, 3], [1, 2, 3]] 
... 
[[2, 3, 4], [2, 3, 4], [2, 3, 4]] 
[[2, 3, 4], [2, 3, 4], [2, 3, 4]] 

그리고이 샘플 내가 중복을 얻을 이유

for i in range(len(M3)-3): 
    for j in range(len(M3[0])-3): 
     X_i_j = [row[0+i:3+i] for row in M3[0+j:3+j]] 
     print(X_i_j) 

내가 무엇이 잘못되었는지를보고하지 않습니다 코드 나는 각각 1 개 중복 6 개 서브 매트릭스를 얻을. 이 경우 numpy없이 2D 배열의 모든 서브 행렬을 어떻게 얻을 수 있습니까?

답변

2

코드는 (바르와 상수의 질서의 변화와) 협력 :

for j in range(len(M3)-2): 
for i in range(len(M3[0])-2): 
    X_i_j = [row[0+i:3+i] for row in M3[0+j:3+j]] 
    print('=======') 
    for x in X_i_j: 
     print(x) 
1

나는 약간의 차이를 해결합니다. y-number 행을 읽는 함수 그 다음 x-number-of-columns 행을 읽는 함수.

이 어떤 (2D) 배열/하위 배열을 위해 일하는 것이 샘플

:

def read_y_rows(array, rows, offset): 
    return array[offset:rows + offset] 


def read_x_cols(array, cols, offset): 
    return list(row[offset:cols + offset] for row in array) 


def get_sub_arrays(array, x_dim_cols, y_dim_rows): 
    """ 
    get 2D sub arrays by x_dim columns and y_dim rows 
    from 2D array (list of lists) 
    """ 
    result = [] 
    for start_row in range(len(array) - y_dim_rows + 1): 
     y_rows = read_y_rows(array, y_dim_rows, start_row) 
     for start_col in range(len(max(array, key=len)) - x_dim_cols + 1): 
      x_columns = read_x_cols(y_rows, x_dim_cols, start_col) 
      result.append(x_columns) 
    return result 

당신이 할 수있는이 기능을 사용하려면

M3 = [list(range(5)) for i in range(6)] 
sub_arrays = get_sub_arrays(M3, 3, 3) ## this would also work for 2x2 arrays 

sub_arrays 다시 목록입니다 발견 된 하위 배열을 모두 포함하는 목록의 경우 다음과 같이 인쇄 할 수 있습니다.

for sub_array in sub_arrays: 
    print() 
    for row in sub_array: 
     print(row) 

위 코드보다 훨씬 많은 코드임을 알고 있습니다.이 코드를 공유하고 싶었습니다.