2016-12-15 4 views
0

次の問題があります。行と列を追加して、別のNumpy配列の形に合わせるために、1つのNumpy配列の形状を変更する必要があります。少ないメモリを使用してnumpy配列に行を追加する

さんがこれを変更する必要がある配列であるとしましょう:

change_array = np.random.rand(150, 120) 

そして、これが基準配列である:私はゼロを含む行と列を追加している形状を一致させるには

reference_array = np.random.rand(200, 170) 

次の関数を使用します。

def match_arrays(change_array, reference_array): 

    cols = np.zeros((change_array.shape[0], (reference_array.shape[1] - change_array.shape[1])), dtype=np.int8) 
    change_array = np.append(change_array, cols, axis=1) 
    rows = np.zeros(((reference_array.shape[0] - change_array.shape[0]), reference_array.shape[1]), dtype=np.int8) 
    change_array = np.append(change_array, rows, axis=0) 
    return change_array 

f change_arrayをreference_arrayの形に変換します。ただし、このメソッドを使用すると、配列をメモリに2回コピーする必要があります。行と列を追加するスペースを確保するために、Numpyがメモリ内の配列のコピーを作成する必要があることを理解しています。

私の配列が非常に大きくなることがありますので、私は同じ結果を得ることができるより効率的な方法のを探しています。ありがとう!

答えて

1

ここにいくつかの方法があります。

In [190]: a 
Out[190]: 
array([[12, 11, 15], 
     [16, 15, 10], 
     [16, 12, 13], 
     [11, 19, 10], 
     [12, 12, 11]]) 

In [191]: b 
Out[191]: 
array([[70, 82, 83, 93, 97, 55], 
     [50, 86, 53, 75, 75, 69], 
     [60, 50, 76, 52, 72, 88], 
     [72, 79, 66, 93, 58, 58], 
     [57, 92, 71, 97, 91, 50], 
     [60, 77, 67, 91, 91, 63], 
     [60, 90, 91, 50, 86, 71]]) 

使用numpy.pad

In [192]: np.pad(a, [(0, b.shape[0] - a.shape[0]), (0, b.shape[1] - a.shape[1])], 'constant') 
Out[192]: 
array([[12, 11, 15, 0, 0, 0], 
     [16, 15, 10, 0, 0, 0], 
     [16, 12, 13, 0, 0, 0], 
     [11, 19, 10, 0, 0, 0], 
     [12, 12, 11, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0]]) 

あるいは、結果は配列として事前に割り当てられたあなたの機能のより効率的なバージョンを使用するコード例では、私は次の配列を使用しますreference_arrayと同じ形状を有するゼロの、そして次いでchange_arrayの値が結果にコピーされている:

2 `concatenates`を行いnp.pad`
In [193]: def match_arrays(change_array, reference_array): 
    ...:  result = np.zeros(reference_array.shape, dtype=change_array.dtype) 
    ...:  nrows, ncols = change_array.shape 
    ...:  result[:nrows, :ncols] = change_array 
    ...:  return result 
    ...: 

In [194]: match_arrays(a, b) 
Out[194]: 
array([[12, 11, 15, 0, 0, 0], 
     [16, 15, 10, 0, 0, 0], 
     [16, 12, 13, 0, 0, 0], 
     [11, 19, 10, 0, 0, 0], 
     [12, 12, 11, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0]]) 
+0

'。各軸の 'prepend'と' postpend'を行います(合計4つの操作)が、パッドのサイズが0の場合は連結をスキップするのに十分です。Pythonで書かれた非常に汎用的な関数です。 – hpaulj

関連する問題