Python 三维阵列中绕轴的唯一旋转总数

Python 三维阵列中绕轴的唯一旋转总数,python,arrays,numpy,3d,rotation,Python,Arrays,Numpy,3d,Rotation,一个三维阵列中围绕一个轴有多少个唯一旋转。例如:一个3x3x3数组可以绕每个轴旋转8次(旋转=单个滚动/元素移动-立方体的一次旋转是将所有切片绕一个轴旋转1个元素)。但是,对于所有三个轴,有8*8*8个旋转。但其中有多少是独一无二的呢? 根据我的计算,有208个。在5x5x5 3D阵列中,总共13824次旋转(24*24*24)中只有2048次是唯一的。 我想如果有人可以确认这些或纠正我,如果我错了 我使用下面的脚本来生成这些 def rotateSlice(slice_data, num_el

一个三维阵列中围绕一个轴有多少个唯一旋转。例如:一个3x3x3数组可以绕每个轴旋转8次(旋转=单个滚动/元素移动-立方体的一次旋转是将所有切片绕一个轴旋转1个元素)。但是,对于所有三个轴,有8*8*8个旋转。但其中有多少是独一无二的呢? 根据我的计算,有208个。在5x5x5 3D阵列中,总共13824次旋转(24*24*24)中只有2048次是唯一的。 我想如果有人可以确认这些或纠正我,如果我错了

我使用下面的脚本来生成这些

def rotateSlice(slice_data, num_elements=1, direction='c'):
    if direction == 'ac':
        num_elements *= -1
    rotated_slice = slice_data
    indexed_slice = numpy.arange(0, slice_data.shape[0]**2).reshape(slice_data.shape)
    int_slice_idx = 0
    for i in range(slice_data.shape[0], 1, -2):
        clipped_array = slice_data[int_slice_idx:slice_data.shape[0]-int_slice_idx, int_slice_idx:slice_data.shape[0]-int_slice_idx]
        clipped_indx_array = indexed_slice[int_slice_idx:slice_data.shape[0]-int_slice_idx, int_slice_idx:slice_data.shape[0]-int_slice_idx]
        outer_border = list(range(i)) + list(range(range(i)[-1]+i, i*(i-2)+range(i)[-1]+i, i)) + list(range(i**2 - 1, i**2 - (i+1), -1)) + list(range(i*(i-2), 0, -i))
        new_outer_border = numpy.roll(outer_border, num_elements)
        rotated_slice.flat[clipped_indx_array.flat[outer_border]] = clipped_array.flat[new_outer_border]
        int_slice_idx +=1
    return rotated_slice


def rotateCube(cube, rotate_dim, num_elements=1, direction='c'):
    out_cube = numpy.zeros(cube.shape, dtype='int')
    for i in range(cube.shape[rotate_dim]):
        slice = numpy.take(cube, i, rotate_dim)
        rotated_slice = rotateSlice(slice, num_elements=num_elements, direction=direction)

        #TODO - Its better if there is a less ugly way to do the following step. Similar to numpy.take
        if rotate_dim == 0:
            out_cube[i,:,:] = rotated_slice
        elif rotate_dim == 1:
            out_cube[:, i, :] = rotated_slice
        elif rotate_dim == 2:
            out_cube[:, :, i] = rotated_slice
    return out_cube


def getAllCubeRotations(cube, step=1, direction='c'):
    total_rotations_in_axis = cube.shape[0]**2 - 1
    rotations = []
    for i in range(int(total_rotations_in_axis)):
        cube = rotateCube(cube, rotate_dim=0, num_elements=step, direction=direction)
        for j in range(int(total_rotations_in_axis)):
            cube = rotateCube(cube, rotate_dim=1, num_elements=step, direction=direction)
            for k in range(int(total_rotations_in_axis)):
                cube = rotateCube(cube, rotate_dim=2, num_elements=step, direction=direction)
                rotations.append(cube)
    return rotations


if __name__ == '__main__':
    size = 5
    a = numpy.arange(0, size*size*size).reshape((size,size,size))
    rotations = getAllCubeRotations(a)
    print(len(rotations))
    uniques = []
    for arr in rotations:
        if not any(numpy.array_equal(arr, unique_arr) for unique_arr in uniques):
            uniques.append(arr)
    print(len(uniques))

我想知道你如何定义旋转-它是90°旋转吗?也就是说,对于
3**3
立方体,翻转到另一个面上,使一般面方向保持不变?否。在这种情况下,旋转是单个元素的滚动(移动)。所以对于一个3*3的立方体,90度的旋转将是2次移动。也许你应该在这里详细说明你对旋转的定义。我个人被困在3D中整个立方体的旋转和“部分”旋转之间的某个地方,就像在魔方立方体的某个层中一样……我将尝试详细阐述。立方体的一次旋转是将所有切片围绕一个轴旋转1个元素。所以在魔方的例子中;整个立方体是旋转的。不是一层。我想知道你是如何定义旋转的-是90°旋转吗?也就是说,对于
3**3
立方体,翻转到另一个面上,使一般面方向保持不变?否。在这种情况下,旋转是单个元素的滚动(移动)。所以对于一个3*3的立方体,90度的旋转将是2次移动。也许你应该在这里详细说明你对旋转的定义。我个人被困在3D中整个立方体的旋转和“部分”旋转之间的某个地方,就像在魔方立方体的某个层中一样……我将尝试详细阐述。立方体的一次旋转是将所有切片围绕一个轴旋转1个元素。所以在魔方的例子中;整个立方体是旋转的。一层也没有。