まず、バイト配列(> = 400x400x1000)バイトを扱います。 オフセットを示すことによって多次元配列(またはその一部)を別の配列に挿入できる小さな関数を書きました。これは、埋め込み配列が埋め込み配列(ケースA)より小さい場合に機能します。それ以外の場合、埋め込み配列は切り捨てられます(ケースB)。埋め込み配列を拡張して配列にナンプイ配列を挿入する
ケースA) 5x5マトリックスに3x3を挿入するには、オフセット1,1を使用します。
ケース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)。この問題を解決するために、かすかなやり方でスマートな方法がありますか?
[[ 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