假设我有一个像这样的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中是否有任何可以用来修改数组的函数?
我想避免使用直接python,因为此代码用于格式化神经网络输入的某些数据,并且python的速度(考虑到实际数组的大小)可能会成为瓶颈。
答案 0 :(得分:1)
分割最后一个轴,然后置换轴-
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
在前面添加新轴-
In [43]: a.reshape(-1,2,2).swapaxes(1,2)[None]
Out[43]:
array([[[[ 1, 3],
[ 2, 4]],
[[ 5, 7],
[ 6, 8]],
[[ 9, 11],
[10, 12]],
[[13, 15],
[14, 16]]]])
In [44]: _.shape
Out[44]: (1, 4, 2, 2)
对于一个已知每个列表的元素数为n
的一般情况,它应该是-
a.reshape(-1,n,a.shape[-1]//n).swapaxes(1,2)[None]
答案 1 :(得分:1)
您非常亲密。然后,您唯一需要做的就是交换第三和第四轴:
>>> 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]]]])
答案 2 :(得分:1)
您可以要求重塑以使用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]]]])