Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 利用大Numpy阵列的对称性_Python_Numpy_Symmetry - Fatal编程技术网

Python 利用大Numpy阵列的对称性

Python 利用大Numpy阵列的对称性,python,numpy,symmetry,Python,Numpy,Symmetry,要制作大数组B,它由较小的numpy数组a组成,以不同的方式翻转: B[0,:,:,:,:] = A B[1,:,:,:,:] = B[0,:,::-1,:,:] B[2:4,:,:,:,:] = B[0:2,:,:,::-1,:] B[4:8,:,:,:,:] = B[0:4,:,:,:,::-1] 有没有一种方法可以只在内存中存储a,而保留numpy阵列的一些功能?我主要对两件事感兴趣: 能够缩放B[m,n,…](即B[m,n,…]*=C,其中B.shape[2:]==C.sha

要制作大数组B,它由较小的numpy数组a组成,以不同的方式翻转:

B[0,:,:,:,:]   = A
B[1,:,:,:,:]   = B[0,:,::-1,:,:]
B[2:4,:,:,:,:] = B[0:2,:,:,::-1,:]
B[4:8,:,:,:,:] = B[0:4,:,:,:,::-1]
有没有一种方法可以只在内存中存储a,而保留numpy阵列的一些功能?我主要对两件事感兴趣:

  • 能够缩放B[m,n,…](即B[m,n,…]*=C,其中B.shape[2:]==C.shape)
  • 能够求和到第二维度(即np.sum(B,轴=(2,3,4)))

我最后做的是创建一个类来返回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]

我最后做的是创建一个类来返回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]

您需要什么功能?大量操作可能会破坏对称性(因此,利用对称性可能获得的任何收益)……在二维情况下,有块矩阵的概念,它允许您对矩阵的某些部分执行特定操作,并缓存这些操作的结果。因此,当您在单个块上组合操作时,可以执行一次操作并使用缓存版本。我肯定张量有一些推广,但你必须做一些研究。因此,这当然是可能的,但正如@mgilson所指出的,它只对特定的操作有用。@mgilson,你说得对,所以我用我想要的主要功能更新了这个问题。当你进行第一次操作时,A的反射应该由C的相同反射副本还是未反射的C来缩放?@user2357112,未反射的C。您需要什么功能?大量操作可能会破坏对称性(因此,利用对称性可能获得的任何收益)……在二维情况下,有块矩阵的概念,它允许您对矩阵的某些部分执行特定操作,并缓存这些操作的结果。因此,当您在单个块上组合操作时,可以执行一次操作并使用缓存版本。我肯定张量有一些推广,但你必须做一些研究。因此,这当然是可能的,但正如@mgilson所指出的,它只对特定的操作有用。@mgilson,你说得对,所以我用我想要的主要功能更新了这个问题。当你进行第一次操作时,A的反射应该由C的相同反射副本还是未反射的C来缩放?@user2357112,未反射的C。