2017-08-27 16 views
3

より大きい配列にゼロで埋められたサイズ2 * 2の配列を挿入したいと思います。さらに、ゼロ配列の位置を左から右へ、反復して上から下へシフトしたいと思います。大きな配列にあらかじめ定義された配列を挿入し、小さな配列の位置を反復して移動します。

zero_array =[0 0 
      0 0] 

large_array =[ 1 2 3 4 
       5 6 7 8 
       9 10 11 12 
       13 14 15 16] 

必要な結果:

Ist iteration 
      [ 0 0 3 4 
       0 0 7 8 
       9 10 11 12 
       13 14 15 16] 
2nd iteration 
      [ 1 0 0 4 
       5 0 0 8 
       9 10 11 12 
       13 14 15 16] 
3rd iteration 
      [ 1 2 0 0 
       5 6 0 0 
       9 10 11 12 
       13 14 15 16] 

4th Iteration 
      [ 1 2 3 4 
       0 0 7 8 
       0 0 11 12 
       13 14 15 16] 

のように...大きな配列の小さな配列を挿入

答えて

0
import copy 
import numpy as np 
la=np.array(<insert array here>) 
za=np.zeros((2,2)) 
ma=copy.deepcopy(la) 
for i in range(len(la)-len(za)+1): 
    for j in range(len(la)-len(za)+1): 
     la=copy.deepcopy(ma) 
     la[i:i+len(za),j:j+len(za)]=za 
     print la 
#la=large array 
#za=zero array 
0

は非常に簡単です、あなただけのどこにそれを見つける必要があります(左上の座標など)を挿入する必要があります。

def insert_array(bigger_arr, smaller_arr, pos): 
    out = np.array(bigger_arr, copy=True) 
    if bigger_arr.ndim != smaller_arr.ndim or bigger_arr.ndim != len(pos): 
     raise ValueError('incompatible dimension') 
    slicer = [slice(p, p+extend) for p, extend in zip(pos, smaller_arr.shape)] 
    out[tuple(slicer)] = smaller_arr 
    return out 

>>> insert_array(np.arange(16).reshape(4, 4), np.zeros((2, 2)), pos=(0, 0)) 
array([[ 0, 0, 2, 3], 
     [ 0, 0, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

それから、ループ内の座標を計算するだけです。これは、発電機の機能を簡単に行うことができます

印刷し
from itertools import product 
def looping_inserting(bigger_arr, smaller_arr): 
    for startpos in product(*[range(big_dim - small_dim + 1) 
           for big_dim, small_dim 
           in zip(bigger_arr.shape, smaller_arr.shape)]): 
     yield insert_array(bigger_arr, smaller_arr, startpos) 

for newarr in looping_inserting(np.arange(1, 17).reshape(4, 4), np.zeros((2, 2))): 
    print(newarr) 

[[ 0 0 3 4] 
[ 0 0 7 8] 
[ 9 10 11 12] 
[13 14 15 16]] 
[[ 1 0 0 4] 
[ 5 0 0 8] 
[ 9 10 11 12] 
[13 14 15 16]] 
[[ 1 2 0 0] 
[ 5 6 0 0] 
[ 9 10 11 12] 
[13 14 15 16]] 
[[ 1 2 3 4] 
[ 0 0 7 8] 
[ 0 0 11 12] 
[13 14 15 16]] 
[[ 1 2 3 4] 
[ 5 0 0 8] 
[ 9 0 0 12] 
[13 14 15 16]] 
[[ 1 2 3 4] 
[ 5 6 0 0] 
[ 9 10 0 0] 
[13 14 15 16]] 
[[ 1 2 3 4] 
[ 5 6 7 8] 
[ 0 0 11 12] 
[ 0 0 15 16]] 
[[ 1 2 3 4] 
[ 5 6 7 8] 
[ 9 0 0 12] 
[13 0 0 16]] 
[[ 1 2 3 4] 
[ 5 6 7 8] 
[ 9 10 0 0] 
[13 14 0 0]]

をあなただけの2D配列を処理する場合は、このコードの多くは、多分それは理解することも良いでしょう、単純化することができます。

from itertools import product 

def insert_array(bigger_arr, smaller_arr, pos): 
    out = np.array(bigger_arr, copy=True) 
    if bigger_arr.ndim != smaller_arr.ndim or bigger_arr.ndim != len(pos): 
     raise ValueError('incompatible dimension') 
    out[pos[0]: pos[0] + smaller_arr.shape[0], 
     pos[1]: pos[1] + smaller_arr.shape[1]] = smaller_arr 
    return out 

def looping_inserting(bigger_arr, smaller_arr): 
    for pos0 in range(bigger_arr.shape[0] - smaller_arr.shape[0] + 1): 
     for pos1 in range(bigger_arr.shape[1] - smaller_arr.shape[1] + 1): 
      yield insert_array(bigger_arr, smaller_arr, (pos0, pos1)) 

for newarr in looping_inserting(np.arange(1, 17).reshape(4, 4), np.zeros((2, 2))): 
    print(newarr) 
関連する問題