1

小さい numpy 配列 A で構成される大きな配列 B を作成したい場合は、さまざまな方法で反転します。

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 配列の機能の一部を保持する方法はありますか? 私が主に興味を持ったのは次の 2 点です。

  • B[m,n,...] をスケーリングできる (つまり、B[m,n,...] *= C where B.shape[2:] == C.shape)
  • 2 番目の次元まで合計できる (つまり、np.sum(B, axis=(2,3,4)))
4

1 に答える 1

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]
于 2016-05-05T16:52:37.940 に答える