numpy.block 重塑问题
numpy.block issue with reshaping
我已经被这个问题困扰了一段时间,如果有人能提供任何想法,我将不胜感激?
我有一个 numpy 数组,比如 A,形状为:(3, 3, 3, 3)。我想基本上使它成为一个二维数组,B 的形状: (9, 9) 同时以自然块顺序保留 A 的内容,即 A[0][0][:][:] 基本上是 3 x 3个子矩阵,也应该出现在B的左上部分。同理,A[2][2][:][:]应该出现在B的右下部分,依此类推。我附上了例子,以澄清。原始数组,A:
array([[[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]],
[[ 1, 1, 1],
[ 1, 1, 1],
[ 1, 1, 1]],
[[ 2, 2, 2],
[ 2, 2, 2],
[ 2, 2, 2]]],
[[[-1, -1, -1],
[-1, -1, -1],
[-1, -1, -1]],
[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]],
[[ 1, 1, 1],
[ 1, 1, 1],
[ 1, 1, 1]]],
[[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]],
[[-1, -1, -1],
[-1, -1, -1],
[-1, -1, -1]],
[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]]]])
和所需的数组,B:
array([[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0]])
您的输入有歧义。我可以使用以下方法复制它:
a = np.repeat(np.array([0,1,2,-1,0,1,-2,-1,0]), 9).reshape(3,3,3,3)
然后,交换轴并重塑得到:
a.swapaxes(1,2).reshape(9,9)
array([[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0]])
但这可能不正确,具体取决于您希望每个 3x3 块在成为另一个 3x3 块时如何表现。
给定范围输入 0->80 (a = np.arange(3**4).reshape(3,3,3,3)
):
array([[[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
...
这将得到:
array([[ 0, 1, 2, 9, 10, 11, 18, 19, 20],
[ 3, 4, 5, 12, 13, 14, 21, 22, 23],
[ 6, 7, 8, 15, 16, 17, 24, 25, 26],
[27, 28, 29, 36, 37, 38, 45, 46, 47],
[30, 31, 32, 39, 40, 41, 48, 49, 50],
[33, 34, 35, 42, 43, 44, 51, 52, 53],
[54, 55, 56, 63, 64, 65, 72, 73, 74],
[57, 58, 59, 66, 67, 68, 75, 76, 77],
[60, 61, 62, 69, 70, 71, 78, 79, 80]])
这是你想要的吗?
我已经被这个问题困扰了一段时间,如果有人能提供任何想法,我将不胜感激?
我有一个 numpy 数组,比如 A,形状为:(3, 3, 3, 3)。我想基本上使它成为一个二维数组,B 的形状: (9, 9) 同时以自然块顺序保留 A 的内容,即 A[0][0][:][:] 基本上是 3 x 3个子矩阵,也应该出现在B的左上部分。同理,A[2][2][:][:]应该出现在B的右下部分,依此类推。我附上了例子,以澄清。原始数组,A:
array([[[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]],
[[ 1, 1, 1],
[ 1, 1, 1],
[ 1, 1, 1]],
[[ 2, 2, 2],
[ 2, 2, 2],
[ 2, 2, 2]]],
[[[-1, -1, -1],
[-1, -1, -1],
[-1, -1, -1]],
[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]],
[[ 1, 1, 1],
[ 1, 1, 1],
[ 1, 1, 1]]],
[[[-2, -2, -2],
[-2, -2, -2],
[-2, -2, -2]],
[[-1, -1, -1],
[-1, -1, -1],
[-1, -1, -1]],
[[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0]]]])
和所需的数组,B:
array([[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0]])
您的输入有歧义。我可以使用以下方法复制它:
a = np.repeat(np.array([0,1,2,-1,0,1,-2,-1,0]), 9).reshape(3,3,3,3)
然后,交换轴并重塑得到:
a.swapaxes(1,2).reshape(9,9)
array([[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[ 0, 0, 0, 1, 1, 1, 2, 2, 2],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0],
[-2, -2, -2, -1, -1, -1, 0, 0, 0]])
但这可能不正确,具体取决于您希望每个 3x3 块在成为另一个 3x3 块时如何表现。
给定范围输入 0->80 (a = np.arange(3**4).reshape(3,3,3,3)
):
array([[[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
...
这将得到:
array([[ 0, 1, 2, 9, 10, 11, 18, 19, 20],
[ 3, 4, 5, 12, 13, 14, 21, 22, 23],
[ 6, 7, 8, 15, 16, 17, 24, 25, 26],
[27, 28, 29, 36, 37, 38, 45, 46, 47],
[30, 31, 32, 39, 40, 41, 48, 49, 50],
[33, 34, 35, 42, 43, 44, 51, 52, 53],
[54, 55, 56, 63, 64, 65, 72, 73, 74],
[57, 58, 59, 66, 67, 68, 75, 76, 77],
[60, 61, 62, 69, 70, 71, 78, 79, 80]])
这是你想要的吗?