2017-12-18 7 views
1

우선, 바이트 배열 (> = 400x400x1000)으로 작업합니다. 오프셋을 나타내는 것으로 다차원 배열 (또는 그 중 일부)을 다른 배열에 삽입 할 수있는 작은 함수를 작성했습니다. 이것은 임베디드 배열이 임베디드 배열 (사례 A)보다 작 으면 작동합니다. 그렇지 않으면 내장 배열이 (사례 B) 잘립니다.배열에 Numpy Array를 삽입합니다.

경우 A) 오프셋 1,1을 사용하여 5x5 행렬에 3x3을 삽입하면 다음과 같이 표시됩니다.

케이스 B) 오프셋이 매립 행렬의 크기를 초과하는 경우는, 작은 어레이는 절단된다. 예 : a (-1, -1) 오프셋은이 결과가됩니다.

[[ 1. 1. 0. 0. 0.] 
[ 1. 1. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.]] 

케이스 C) 지금 대신 내장 배열 잘라내로, I가 내장 배열 매립 어레이보다 큰 또는 오프셋을 적용 어느 경우) 제로하여 매립 어레이 (확장 할 (예를 들어 케이스 B). 이 문제를 해결하기 위해 numpy 또는 scipy와 같은 현명한 방법이 있습니까?

[[ 1. 1. 1. 0. 0. 0.] 
[ 1. 1. 1. 0. 0. 0.] 
[ 1. 1. 1. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0.]] 

실제로 저는 3D 배열을 사용하지만 실제로는 2D 배열의 예제를 작성했습니다. 현재 소스 :

import numpy as np 
import nibabel as nib 

def addAtPos(mat_bigger, mat_smaller, xyz_coor): 
    size_sm_x, size_sm_y = np.shape(mat_smaller) 
    size_gr_x, size_gr_y = np.shape(mat_bigger) 

    start_gr_x, start_gr_y = xyz_coor 
    start_sm_x, start_sm_y = 0,0 

    end_x, end_y = (start_gr_x + size_sm_x), (start_gr_y + size_sm_y) 

    print(size_sm_x, size_sm_y) 
    print(size_gr_x, size_gr_y) 
    print(end_x, end_y) 

    if start_gr_x < 0: 
     start_sm_x = -start_gr_x 
     start_gr_x = 0 
    if start_gr_y < 0: 
     start_sm_y = -start_gr_y 
     start_gr_y = 0 

    if end_x > size_gr_x: 
     size_sm_x = size_sm_x - (end_x - size_gr_x) 
     end_x = size_gr_x 
    if end_y > size_gr_y: 
     size_sm_y = size_sm_y - (end_y - size_gr_y) 
     end_y = size_gr_y 

    # copy all or a chunk (if offset is small/big enough) of the smaller matrix into the bigger matrix 
    mat_bigger[start_gr_x:end_x, start_gr_y:end_y] = mat_smaller[start_sm_x:size_sm_x, start_sm_y:size_sm_y] 
    return mat_bigger 


a_gr = np.zeros([5,5]) 
a_sm = np.ones([3,3]) 
a_res = addAtPos(a_gr, a_sm, [-2,1]) 
#print (a_gr) 
print (a_res) 
+1

[numpy.pad'] (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.pad.html)에서 0으로 채울 수 있습니다 새 패딩 된 배열에 더 작은 배열을 삽입하기 전에 큰 배열. – jadsq

+1

'np.pad '는 복잡하고 상대적으로 느립니다. 그것이 성장해야한다면 나는 단지 새로운'mat_bigger'를 만들 것입니다. 몇 가지'if' 문을 두려워하지 마십시오. 그들은 한 번만 실행됩니다. ('np.pad'를 보면 numpy 함수가 여러 개의 치수와 매개 변수를 처리하는 데 어떤 효과가 있는지 알 수 있습니다. 예쁜 것은 아닙니다.) – hpaulj

+0

제안대로 해결했습니다. 나는 아마도 편안함 기능이있을 것이라고 생각했다. – dgrat

답변

0

실제로 더 쉬운 방법이 있습니다. (A)의 하위 집합을 선택하고 연속 내에서 어디를 삽입 할 수 있습니다 슬라이스와 함께 연주함으로써

A = np.array([[1,1,1], [1,1,1], [1,1,1]]) 
(N, M) = A.shape 

B = np.zeros(shape=(N + 2, M + 2)) 
B[1:-1:, 1:-1] = A 

: 당신이 뭔가 함께 할 수있는 5 × 5의 하나에 포함 된 3 × 3 배열의 첫 번째 예를 들어

B의 하위 집합

희망이 있습니다! ;-)