将Numpy Array插入数组并扩展嵌入数组

首先,我使用字节数组(> = 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)

回答:

其实有一个更简单的方法来做到这一点。

为了您的嵌入式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的子集。

希望它有帮助! ;-)

以上是 将Numpy Array插入数组并扩展嵌入数组 的全部内容, 来源链接: utcz.com/qa/262474.html

回到顶部