如何拆分2D数组,从“行到行”值创建数组

时间:2017-10-10 12:01:17

标签: python numpy

我想以这种方式拆分2D数组:

实施例

从这个4x4 2D阵列:

np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])

创建这四个2x2 2D阵列:

np.array([[1,2],[3,4]])
np.array([[5,6],[7,8]])
np.array([[9,10],[11,12]])
np.array([[13,14],[15,16]])

在一般情况下,从NxN 2D阵列(正方形阵列)创建尽可能多的KxK形状的2D阵列。

更确切地说:要创建输出数组,不一定要使用行中的所有值。

示例:

从2D 8x8数组中,值为1到64,如果我想在2D 2x2数组中拆分此数组,则8x8数组中的第一行是1到8的行,第一个输出2D 2x2数组将是是np.array([[1,2],[3,4]]),第二个输出2D 2x2数组将是np.array([[5,6],[7,8]])...它一直持续到最后一个输出2D数组,即np.array([[61,62],[63,64]])。看看每个2D 2x2数组都没有填充行中的所有值(CORRECT)。

有一种Numpy方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:3)

您可能正在寻找类似numpy.reshape的内容。

在你的例子中:

numpy.array([[1,2,3,4], [5,6,7,8]]).reshape(2,4)
>>>array([[1,2], [3,4], [5,6], [7,8]])

或者,正如@MSeifert所建议的那样,使用-1作为最终维度会让numpy单独进行除法:

numpy.array([[1,2,3,4], [5,6,7,8]]).reshape(2,-1)
>>>array([[1,2], [3,4], [5,6], [7,8]])

答案 1 :(得分:2)

要获得所需的输出,您需要重塑为3D阵列,然后解压缩第一维:

>>> inp = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
>>> list(inp.reshape(-1, 2, 2))
[array([[1, 2],
        [3, 4]]), 
 array([[5, 6],
        [7, 8]]), 
 array([[ 9, 10],
        [11, 12]]), 
 array([[13, 14],
        [15, 16]])]

如果要将数组存储在不同的变量而不是一个数组列表中,也可以使用=解压缩:

>>> out1, out2, out3, out4 = inp.reshape(-1, 2, 2)
>>> out1
array([[1, 2],
       [3, 4]])

如果您对包含2D 2x2阵列的3D阵列感到满意,则无需解压缩或list()来电:

>>> inp.reshape(-1, 2, 2)
array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]],

       [[13, 14],
        [15, 16]]])

-1reshape的特殊值。正如documentation所述:

  

一个形状尺寸可以是-1。在这种情况下,该值是从数组长度和剩余维度推断出来的。

如果您希望它更通用,只需取行长的平方根并将其用作reshape的参数:

>>> inp = np.ones((8, 8))  # 8x8 array
>>> square_shape = 2
>>> inp.reshape(-1, square_shape, square_shape)  # 16 2x2 arrays

>>> square_shape = 4
>>> inp.reshape(-1, square_shape, square_shape)  # 4 4x4 arrays

答案 2 :(得分:0)

如果你想逐行拆分,你可以做np.reshape(arr,(2,2),order ='C') 如果你想按列分割它,你可能没有.reshape(arr,(2,2),order ='F')