2017-12-18 150 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的子集。

希望它有帮助! ;-)