在列块中展平或分组数组 - NumPy / Python

Flatten or group array in blocks of columns - NumPy / Python

有什么简单的方法可以压扁

import numpy    
np.arange(12).reshape(3,4)
Out[]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

进入

array([ 0,  1,  4,  5, 8, 9, 2, 3, 6, 7, 10, 11])

您似乎希望考虑特定数量的列来形成块,然后获取每个块中的元素,然后移动到下一个块中。因此,考虑到这一点,这是一种方法 -

In [148]: a
Out[148]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [149]: ncols = 2 # no. of cols to be considered for each block

In [150]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1).ravel()
Out[150]: array([ 0,  1,  4,  5,  8,  9,  2,  3,  6,  7, 10, 11])

中详细讨论了背后的动机。

此外,要保持二维格式 -

In [27]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1).reshape(-1,ncols)
Out[27]: 
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [ 2,  3],
       [ 6,  7],
       [10, 11]])

并以 直观的 3D 数组格式 -

In [28]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1)
Out[28]: 
array([[[ 0,  1],
        [ 4,  5],
        [ 8,  9]],

       [[ 2,  3],
        [ 6,  7],
        [10, 11]]])

您可以使用列表理解将数组分割成块,然后使用 numpy.ndarray.flatten 方法将块展平成一维数组(这仅在 a.shape[1] 可被块大小 n):

import numpy as np

a = np.arange(12).reshape(3, 4)

n = 2

res = np.array([a[:, i : i + n] for i in range(0, a.shape[1], n)]).flatten()

print(res)

输出:

[ 0  1  4  5  8  9  2  3  6  7 10 11 ]

另一种方式:

first_list = [entry[0:2] for entry in a]
second_list = [entry[2:4] for entry in a]
flat_list = [item for sublist in first_list for item in sublist] + [item for sublist in second_list for item in sublist]

flat_list # [0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11]

为此,我将简单地切片并 concatenate:

n = a.shape[1]//2
np.concatenate([a[:,:n], a[:,n:]]).ravel()
# array([ 0,  1,  4,  5,  8,  9,  2,  3,  6,  7, 10, 11])

如果您愿意,我有一个不涉及 numpy 的解决方案,它会处理您将获得的每种数组,

[[12312],[],[[]]] 
[[[2]], [4, [5, 6, [6], 6, 6, 6], 7]]
[-1, [1, [-2], 1], -1]
etc

第一个选项(不适用于 strings

def flat_list(array):
    return list(flatten(array))              
def flatten(nested): 
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested

第二个选项:

def flatten(nested): #in case you got strings and you want to avoide an infinite recursion
    try:
        # Don't iterate over string-like objects:
        try: nested + ''
        except TypeError: pass
        else: raise TypeError
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested

您在这里使用了 numpy。它有一种方法可以完全按照您的意愿行事。

import numpy as np

arr = np.arange(12).reshape(3,4)
flat = arr.flatten()

另一种方法:

a = []
[a.extend(x) for x in arr]