2017-12-18 6 views
1

まず、バイト配列(> = 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) 
+1

[numpy.pad'](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.pad.html)をチェックしてゼロを埋め込むことができますより大きな配列をその新しいパディング配列に挿入します。 – jadsq

+1

'np.pad'は複雑で比較的遅いです。私が成長する必要があるならば、私はちょうど新しい 'mat_bigger'を作ります。いくつかの 'if'文を恐れてはいけません。それらは一度だけ実行されます。 ( 'np.pad'を見て、いくつかのnumpy関数が複数の次元とパラメータを扱うために何をするかを見てください。それはかなりありません) – hpaulj

+0

私はあなたが示唆したように解決しました。私は、おそらく快適さの機能があると思った。 – dgrat

答えて

0

実際には、より簡単な方法があります。 Aのサブセットを選択し、連続内のどこにでもそれを挿入することができますをスライスと一緒に遊んでは

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 

:あなたのようなものでそれを行うことができます5×5のいずれかに埋め込まれた3×3アレイのあなたの最初の例

Bのサブセット

希望すると助かります! ;-)

関連する問題