2017-12-18 149 views
1

首先,我使用字節數組(> = 400x400x1000)字節。 我寫了一個小函數,它可以通過指示偏移量將多維數組(或一部分)插入另一個數組中。如果嵌入式陣列小於嵌入陣列(情況A),則這起作用。否則,嵌入的陣列被截斷(情況B)將Numpy Array插入數組並擴展嵌入數組

情況A)將3x3插入偏移1,1的5x5矩陣中應該是這樣的。

情況B)如果偏移超過嵌入矩陣的尺寸,較小的陣列被截斷。例如。 (-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)現在,而不是截斷嵌入式陣列,我想延長嵌入陣列(由零),如果嵌入式陣列是除了嵌入陣列更大的或偏移執行它(例如情況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)以填充零在插入新填充數組中的較小數組之前更大的數組。 – jadsq

+1

'np.pad'很複雜,而且比較慢。如果需要增長,我只需要創建一個新的「mat_bigger」。不要害怕幾句if語句。他們只運行一次。 (查看'np.pad'來查看一些numpy函數處理多個維度和參數的情況,這並不美觀。) – hpaulj

+0

我按照你的建議解決了它。我想,這可能有一個舒適的功能。 – dgrat

回答

0

其實有一個更簡單的方法來做到這一點。

爲了您的嵌入式5x5的一個你可以像做一個3x3的陣列的第一個例子:

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 

通過與切片你玩可以選擇的一個子集,並在一個連續的任何位置插入它B的子集。

希望它有幫助! ;-)