如何在python中重塑此图像数组?

如何在python中重塑此图像数组?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有一个8X8图像阵列,如下所示: a = np.array([[1,1,1,1,2,2,2,2], [1,1,1,1,2,2,2,2], [1,1,1,1,2,2,2,2], [1,1,1,1,2,2,2,2], [3,3,3,3,4,4,4,4], [3,3,3,3,4,4,4,4], [3,3,3,3,4,4,4,4],

我有一个8X8图像阵列,如下所示:

a = np.array([[1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4]])
a = np.array([
              [[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],
              [[2,2,2,2],[2,2,2,2],[2,2,2,2],[2,2,2,2]],
              [[3,3,3,3],[3,3,3,3],[3,3,3,3],[3,3,3,3]],
              [[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]
             ])
我想将其重塑为一个数组,使每个部分彼此独立,如下所示:

a = np.array([[1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4]])
a = np.array([
              [[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]],
              [[2,2,2,2],[2,2,2,2],[2,2,2,2],[2,2,2,2]],
              [[3,3,3,3],[3,3,3,3],[3,3,3,3],[3,3,3,3]],
              [[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]
             ])
这是一个4X4X4阵列,我可以单独绘制图像的部分。我该怎么做呢?

这样就可以了:

>>> b = np.split(np.hstack(np.split(a, 2)), 4, axis=1)
>>> np.array(b)
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3]],

       [[4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4]]])
这可以做到:

>>> b = np.split(np.hstack(np.split(a, 2)), 4, axis=1)
>>> np.array(b)
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3]],

       [[4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4]]])
您也可以尝试以下方法:

np.column_stack((a[:4,:4].ravel(),a[:4,4:8].ravel(),a[4:8,:4].ravel(),a[4:8,4:8].ravel())).T.reshape((4,4,4))
或者这个:

np.concatenate(a.reshape(2,4,8).T).T.reshape((4,4,4))
您也可以尝试以下方法:

np.column_stack((a[:4,:4].ravel(),a[:4,4:8].ravel(),a[4:8,:4].ravel(),a[4:8,4:8].ravel())).T.reshape((4,4,4))
或者这个:

np.concatenate(a.reshape(2,4,8).T).T.reshape((4,4,4))

重新安排阵列的步幅:

import numpy as np
from numpy.lib.stride_tricks import as_strided

def windows(a, window = (2,2), ss = None, flatten = True):
    '''
    Return a sliding window over a.

    a - numpy ndarray
    window - shape of the window, int for 1d or tuple for 2d+
    ss - int for 1d or tuple for 2d+ how much to slide the window
         defaults to window (no overlap)
    flatten - if True, all slices are flattened, otherwise, there is an 
                  extra dimension for each dimension of the input.

    Returns
        an array containing each n-dimensional window from a
    '''
    if ss is None:
        ss = window
    data_shape = np.array(a.shape)

    # how many windows are there?
    windowed_array_shape = tuple(((data_shape - window) // window) + 1)
    nbr_windows = np.product(windowed_array_shape)

    # the shape of the windowed array
    newshape = windowed_array_shape + window

    # calculate the strides for the windowed array
    newstrides =  tuple(np.array(a.strides) * window) + a.strides

    # use as_strided to 'transform' the array
    windowed_array = as_strided(a, shape = newshape, strides = newstrides)

    if not flatten:
        return windowed_array

    # flatten the windowed array for iteration
    dim = (nbr_windows,) + window
    windowed_array = windowed_array.reshape(dim)
    return windowed_array

a = np.array([[1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4]])

>>> b = windows(a, (4,4))
>>> b
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3]],

       [[4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4]]])
>>>

在重新安排阵列的步幅时,还有几个其他选项:

import numpy as np
from numpy.lib.stride_tricks import as_strided

def windows(a, window = (2,2), ss = None, flatten = True):
    '''
    Return a sliding window over a.

    a - numpy ndarray
    window - shape of the window, int for 1d or tuple for 2d+
    ss - int for 1d or tuple for 2d+ how much to slide the window
         defaults to window (no overlap)
    flatten - if True, all slices are flattened, otherwise, there is an 
                  extra dimension for each dimension of the input.

    Returns
        an array containing each n-dimensional window from a
    '''
    if ss is None:
        ss = window
    data_shape = np.array(a.shape)

    # how many windows are there?
    windowed_array_shape = tuple(((data_shape - window) // window) + 1)
    nbr_windows = np.product(windowed_array_shape)

    # the shape of the windowed array
    newshape = windowed_array_shape + window

    # calculate the strides for the windowed array
    newstrides =  tuple(np.array(a.strides) * window) + a.strides

    # use as_strided to 'transform' the array
    windowed_array = as_strided(a, shape = newshape, strides = newstrides)

    if not flatten:
        return windowed_array

    # flatten the windowed array for iteration
    dim = (nbr_windows,) + window
    windowed_array = windowed_array.reshape(dim)
    return windowed_array

a = np.array([[1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [1,1,1,1,2,2,2,2],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4],
              [3,3,3,3,4,4,4,4]])

>>> b = windows(a, (4,4))
>>> b
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3],
        [3, 3, 3, 3]],

       [[4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4],
        [4, 4, 4, 4]]])
>>>

中还有几个其他选项,这里有一种使用和的方法-

这里有一种使用和的方法-


我得到[1,1,1,1],[2,2,2],[3,3,3],[4,4,4],[4]我错过了交换吗?是不是应该是swapaxes1,2?@NaN啊,是的,我第一次对它的解释不同。修好了。谢谢你指出!我得到[1,1,1,1],[2,2,2],[3,3,3],[4,4,4],[4]我错过了交换吗?是不是应该是swapaxes1,2?@NaN啊,是的,我第一次对它的解释不同。修好了。谢谢你指出!