通过扩展嵌入数组将Numpy Array插入Array

时间:2017-12-18 10:22:43

标签: python numpy scipy

首先,我使用字节数组(> = 400x400x1000)字节。 我写了一个小函数,它可以通过指示偏移量将多维数组(或一小部分)插入到另一个数组中。如果嵌入数组小于嵌入数组(情况A),则此方法有效。否则,嵌入式阵列将被截断(案例B)

案例A)将3x3插入到偏移1,1的5x5矩阵中将如下所示。

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

情况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)现在,如果嵌入式数组要比嵌入数组大或者偏移强制执行它,我想要扩展嵌入数组(通过零)而不是截断嵌入数组(例如案例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 个答案:

答案 0 :(得分: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

通过玩切片,您可以选择A的子集并将其插入B的连续子集中的任何位置。

希望它有所帮助! ; - )