这是一个非常具体的问题。我有这样一个数组:
x = np.array([[[-3, 0], [0, 0]], [[0, 0], [0, -3]], [[2, 0], [0, 0]], [[-3, 0], [0, 0]]])
[[[-3 0]
[ 0 0]]
[[ 0 0]
[ 0 -3]]
[[2 0]
[ 0 0]]
[[-3 0]
[ 0 0]]]
我希望它是这样的…其中第一个数组在左上角,下一个数组在右上方,第三个在左下角,第四个在右下角。我的实际示例在原始数组中有四个以上的2x2s…我只是想做一个简单的例子。
我已经试过了:
x.reshape(1,4,4)
但是结果是:
array([[[-3, 0, 0, 0],
[ 0, 0, 0, -3],
[2, 0, 0, 0],
[-3, 0, 0, 0]]])
预期:
array([[[-3, 0, 0, 0],
[ 0, 0, 0, -3],
[2, 0, -3, 0],
[0, 0, 0, 0]]])
不要通过1
:
>>> x.reshape(4, 4)
array([[-3, 0, 0, 0],
[ 0, 0, 0, -3],
[ 2, 0, 0, 0],
[-3, 0, 0, 0]])
你描述的是你想把你最里面的大小4变成2x2。因此,你想要的是一个2x2矩阵的2x2数组:
>>> x.reshape(2, 2, 2, 2)
array([[[[-3, 0],
[ 0, 0]],
[[ 0, 0],
[ 0, -3]]],
[[[ 2, 0],
[ 0, 0]],
[[-3, 0],
[ 0, 0]]]])
如果你想渲染这样,你需要写你自己的__repr__
函数:numpy
只做底部两个维度的2-D的事情。但是,您可以看到这个重塑中的组织。
有两个轴被改变。你必须用np.moveaxis
改变轴。
np。moveaxis(array, axis_source, axis_destination):将数组的坐标轴移动到新的位置
x = np.moveaxis(x, 2,0)
x = np.reshape(x,(2,2,4))
x = np.moveaxis(x, 0,1)
和(如果你需要)最后的重塑:
x = np.reshape(x,(1,4,4))
输出:
[[[-3 0 0 0]
[ 0 0 0 -3]
[ 2 0 -3 0]
[ 0 0 0 0]]]
您可以使用np.block
。你必须提供你的"角落";作为列表的列表中的元素:
x = np.array([[[-3, 0], [0, 0]], [[0, 0], [0, -3]], [[2, 0], [0, 0]], [[-3, 0], [0, 0]]])
np.block([[x[0], x[1]], [x[2], x[3]]])
输出array([[-3, 0, 0, 0],
[ 0, 0, 0, -3],
[ 2, 0, -3, 0],
[ 0, 0, 0, 0]])