2016-05-03 17 views
1

の対称性を利用して、Bは、それは小さなnumpyの配列で構成され、Aは、さまざまな方法でひっくり返さ:は、大規模な配列を作りたい大numpyのアレイ

B[0,:,:,:,:] = A 
B[1,:,:,:,:] = B[0,:,::-1,:,:] 
B[2:4,:,:,:,:] = B[0:2,:,:,::-1,:] 
B[4:8,:,:,:,:] = B[0:4,:,:,:,::-1] 

は唯一の店舗Aに方法はありますメモリが、Bのためのnumpy配列の機能のいくつかを保つか?私は二つのことで、主に興味があった:

  • 、すなわちB [M、N、...] * = C B.SHAPE [2([... M、N、] Bを拡張することができます。 ] == C.shape)
  • 二次元(すなわちnp.sum(B、軸=(2,3,4))まで可能な合計となる)
+1

どのような機能が必要ですか?広い範囲の操作はあなたの対称性を損なう可能性があります(したがって、対称性を利用することで得られる利益)。 – mgilson

+0

2次元の場合、ブロック行列の概念があります。マトリックスの一部に対する特定の演算を実行し、それらの演算の結果をキャッシュする。したがって、個々のブロックで操作を結合すると、それらを一度実行して、キャッシュされたバージョンを使用することができます。私はテンソルにいくつかの一般化があると確信していますが、あなたはいくつかの研究をする必要があります。ですから、これは確かに可能ですが、@ mgilsonが指摘するように、それは特定の操作にのみ役立ちます。 –

+0

@mgilson、あなたが正しいので、私が探していた主な機能で質問を更新しました。 – dfreese

答えて

0

私がやってしまった何を作成しましたAの任意に反映された部分のビューを返すクラスです。私はこのビューを返すと、現在は十分に速かったように、Cによるスケーリングと合計を行っていました。これはエラーチェックなしです:

class SymmetricArray: 
    ''' 
    Attributes: 
     A (np.ndarray): an [m, (a,b,c...)] array. 
     idx (np.ndarray): an [n,] array where idx[n] points to A[idx[n], ...] 
      to be used. 
     reflect (np.ndarray): an [n, d] array where every entry is 1 or -1 and 
      reflect[n, i] indicates whether or not the ith dimension of 
      A[idx[n], ...] should be reflected, and d = len(A.shape - 1). 
    ''' 
    def __init__(self, A, idx, reflect): 
     self.A = np.asarray(A) 
     self.idx = np.asarray(idx, dtype=int) 
     self.reflect = np.asarray(reflect, dtype=int) 

    def __getitem__(self, ii): 
     ''' 
     Returns: 
      np.ndarray: appropriately reflected A[idx[ii], ...] 
     ''' 
     a_mask = [slice(None, None, a) for a in self.reflect[ii, :]] 
     return self.A[self.idx[ii], ...][a_mask] 
関連する問題