将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