Python:重塑数组数组

Python: Reshaping array of arrays

是否可以像这样重塑数组数组:

np.array([[1,1,1,1,1,1],
          [1,0,0,0,0,1],
          [1,0,1,1,0,1]])

分成多个 3x2 数组,如下所示:

np.array([
    [[1,1],[1,0],[1,0]],
    [[1,1],[0,0],[1,1]],
    [[1,1],[0,1],[0,1]]])

提前致谢!

numpy 有能力 reshape().

In [29]: a=np.array([[1,1,1,1,1,1],
    ...:           [1,0,0,0,0,1],
    ...:           [1,0,1,1,0,1]])

In [30]: a.reshape((3,3,2))
Out[30]:
array([[[1, 1],
        [1, 1],
        [1, 1]],

       [[1, 0],
        [0, 0],
        [0, 1]],

       [[1, 0],
        [1, 1],
        [0, 1]]])

不过,这只是改变了看法。如果需要,您可以重新分配 a = a.reshape((3,3,2))

要获得您正在寻找的特定输出,您需要重塑和转置特定列(通过传入要转置的列)。

首先你需要重塑以获得你想要的分组。使用 -1 就像一个通配符,它​​将使中间值成为正确填充形状所需的任何值。

使用 arr.reshape(3,-1, 2) 进行重塑可以得到:

array([[[1, 1],[1, 1],[1, 1]],
       [[1, 0],[0, 0],[0, 1]],
       [[1, 0],[1, 1],[0, 1]]])

组是正确的,但希望将列分组为行。这就是 transpose 的用途。在这种情况下,您想交换第一轴和第二轴。

您可以像这样一步完成:

import numpy as np

arr = np.array([
    [1,1,1,1,1,1],
    [1,0,0,0,0,1],
    [1,0,1,1,0,1]])

arr.reshape(3,-1, 2).transpose([1, 0, 2])

输出:

array([[[1, 1], [1, 0], [1, 0]],
       [[1, 1], [0, 0], [1, 1]],
       [[1, 1], [0, 1], [0, 1]]])

如果可以将一个数组重新整形为另一个数组,最好的回答方法是比较它们的展平形式:

arr = np.array([[1,1,1,1,1,1], [1,0,0,0,0,1], [1,0,1,1,0,1]])
arr2 = np.array([[[1,1],[1,0],[1,0]], [[1,1],[0,0],[1,1]], [[1,1],[0,1],[0,1]]])
>>> print(arr.flatten())
[1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1]
>>> print(arr2.flatten())
[1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1]

在这种情况下,这是不可能的,因为结果不同。您还需要 swapaxes

arr.reshape(3,3,2).swapaxes(0,1)