首先,我使用字节数组(> = 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)
答案 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的连续子集中的任何位置。
希望它有所帮助! ; - )