Python 将第N维度中的项目拆分并交换到第N+1维度
假设我有一个numpy数组,如下所示:Python 将第N维度中的项目拆分并交换到第N+1维度,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,假设我有一个numpy数组,如下所示: [[[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16]]] 它的尺寸是1,4,4 我想把它转换成: [[[[ 1, 3], [ 2, 4]], [[ 5, 7], [ 6, 8]], [[ 9, 11], [10, 12]], [[13, 15], [14, 16]]]] 它的尺寸是1,4,2,2 numpy中是否有任何函数可以用来
[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]]
它的尺寸是1,4,4
我想把它转换成:
[[[[ 1, 3], [ 2, 4]],
[[ 5, 7], [ 6, 8]],
[[ 9, 11], [10, 12]],
[[13, 15], [14, 16]]]]
它的尺寸是1,4,2,2
numpy中是否有任何函数可以用来修改数组
array.Reformate已关闭,但不完全是因为它无法交换项。
我希望避免使用纯python,因为这段代码用于为神经网络输入格式化一些数据,并且给定实际数组大小的python速度可能是一个瓶颈。拆分最后一个轴,然后排列轴-
In [41]: a
Out[41]:
array([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]])
In [42]: a.reshape(-1,2,2).swapaxes(1,2)
Out[42]:
array([[[ 1, 3],
[ 2, 4]],
[[ 5, 7],
[ 6, 8]],
[[ 9, 11],
[10, 12]],
[[13, 15],
[14, 16]]])
如果需要最终输出形状为1,4,2,2,请在前面添加一个带有None/np.newaxis的新轴-
对于每个列表的元素数已知的一般情况,例如n,它将是-
a.reshape(-1,n,a.shape[-1]//n).swapaxes(1,2)[None]
拆分最后一个轴,然后排列轴-
In [41]: a
Out[41]:
array([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]])
In [42]: a.reshape(-1,2,2).swapaxes(1,2)
Out[42]:
array([[[ 1, 3],
[ 2, 4]],
[[ 5, 7],
[ 6, 8]],
[[ 9, 11],
[10, 12]],
[[13, 15],
[14, 16]]])
如果需要最终输出形状为1,4,2,2,请在前面添加一个带有None/np.newaxis的新轴-
对于每个列表的元素数已知的一般情况,例如n,它将是-
a.reshape(-1,n,a.shape[-1]//n).swapaxes(1,2)[None]
你很接近。然后,您只需交换第三和第四个轴:
>>> np.swapaxes(a.reshape(1,4,2,2), 2,3)
array([[[[ 1, 3],
[ 2, 4]],
[[ 5, 7],
[ 6, 8]],
[[ 9, 11],
[10, 12]],
[[13, 15],
[14, 16]]]])
你很接近。然后,您只需交换第三和第四个轴:
>>> np.swapaxes(a.reshape(1,4,2,2), 2,3)
array([[[[ 1, 3],
[ 2, 4]],
[[ 5, 7],
[ 6, 8]],
[[ 9, 11],
[10, 12]],
[[13, 15],
[14, 16]]]])
您可以要求重塑以使用FORTRAN顺序:
a = np.arange(1,17).reshape(1,4,4)
a.reshape(*a.shape[:-1],2,2,order="F")
# array([[[[ 1, 3],
# [ 2, 4]],
#
# [[ 5, 7],
# [ 6, 8]],
#
# [[ 9, 11],
# [10, 12]],
#
# [[13, 15],
# [14, 16]]]])
您可以要求重塑以使用FORTRAN顺序:
a = np.arange(1,17).reshape(1,4,4)
a.reshape(*a.shape[:-1],2,2,order="F")
# array([[[[ 1, 3],
# [ 2, 4]],
#
# [[ 5, 7],
# [ 6, 8]],
#
# [[ 9, 11],
# [10, 12]],
#
# [[13, 15],
# [14, 16]]]])
虽然这个答案直接解决了我的问题,但Divakar的答案更一般,并且可能对阅读此问题的人更有用。虽然这个答案直接解决了我的问题,但Divakar的答案更一般,并且可能对阅读此问题的人更有用。