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)
你可以查看['numpy.pad'](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.pad.html)以填充零在插入新填充數組中的較小數組之前更大的數組。 – jadsq
'np.pad'很複雜,而且比較慢。如果需要增長,我只需要創建一個新的「mat_bigger」。不要害怕幾句if語句。他們只運行一次。 (查看'np.pad'來查看一些numpy函數處理多個維度和參數的情況,這並不美觀。) – hpaulj
我按照你的建議解決了它。我想,這可能有一個舒適的功能。 – dgrat