Python NumPy将列转换为行
Python 2.7.10和NumPy。我有这样一个矩阵:Python NumPy将列转换为行,python,numpy,Python,Numpy,Python 2.7.10和NumPy。我有这样一个矩阵: [[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] [[12 13 14] [15 16 17] [18 19 20] [21 22 23]] [[24 25 26] [27 28 29] [30 31 32] [33 34 35]] [[36 37 38] [39 40 41] [42 43 44] [45 46 47]]] 注:实数矩阵将包含实数数据,而不是连续数字 我需要旋转、翻转
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]
[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]]
注:实数矩阵将包含实数数据,而不是连续数字
我需要旋转、翻转或其他方式(我已经全部尝试过了),以便最终得到以下结果:
[[[ 2 5 8 11]
[ 1 4 7 10]
[ 0 3 6 9]
[[14 17 20 23]
[13 16 19 22]
[12 15 18 21]
[[26 29 32 35]
[25 28 31 34]
[24 27 30 33]
[[38 41 44 47]
[37 40 43 46]
[36 39 42 45]]]
基本上,我需要矩阵的整列变成行
谢谢。对于超级阵列中的每个2d子阵列,您可以应用numpy功能:
np.rot90()
因此:
transpose
和flipud
是您需要的;swapax
也可以用作转置
请注意,transpose有一个在多个维度上运行的版本
这可能有一个更简单的表达式,但它的优点是不使用复杂的索引。例如,在Python2.7.3中使用numpy完成
f=numpy.flipud
a=numpy.arange(48).reshape((4,4,3))
result=f(f(f(a).T).T).transpose(0,2,1)
In [2]: a=numpy.arange(48).reshape((4,4,3))
Out[3]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]],
[[24, 25, 26],
[27, 28, 29],
[30, 31, 32],
[33, 34, 35]],
[[36, 37, 38],
[39, 40, 41],
[42, 43, 44],
[45, 46, 47]]])
In [5]: f(f(f(a).T).T).transpose(0,2,1)
Out[5]:
array([[[ 2, 5, 8, 11],
[ 1, 4, 7, 10],
[ 0, 3, 6, 9]],
[[14, 17, 20, 23],
[13, 16, 19, 22],
[12, 15, 18, 21]],
[[26, 29, 32, 35],
[25, 28, 31, 34],
[24, 27, 30, 33]],
[[38, 41, 44, 47],
[37, 40, 43, 46],
[36, 39, 42, 45]]])
.使用
[:,:,:::-1]
翻转列的位置,并用于将行与列交换-
In [25]: A
Out[25]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]],
[[24, 25, 26],
[27, 28, 29],
[30, 31, 32],
[33, 34, 35]]])
In [26]: A[:,:,::-1].transpose(0,2,1)
Out[26]:
array([[[ 2, 5, 8, 11],
[ 1, 4, 7, 10],
[ 0, 3, 6, 9]],
[[14, 17, 20, 23],
[13, 16, 19, 22],
[12, 15, 18, 21]],
[[26, 29, 32, 35],
[25, 28, 31, 34],
[24, 27, 30, 33]]])
这里有一个更简单的方法:
a=numpy.arange(48).reshape((4,4,3)
numpy.fliplr(a.swapaxes(1,2))
#or you could do
numpy.fliplr(a.transpose(0,2,1))
据我所知,flipud
翻转最后一个维度,而fliplr
翻转第二个维度到最后一个维度。在三维中,最后一个维度是Z,而倒数第二个维度是Y。因此,转换数据和翻转Y维度是有效的
享受。谢谢你的回答。谢谢。我很感激。我确实尝试过切片和转置,但只是没有将两者结合在一起。我测试了这种方法与另一种方法(fliplr(a).转置(0,2,1)和f(f(a).T).转置(0,2,1)的比较,发现这花费了5.3秒;fliplr花费了8.3秒,最后一次使用timeit模块花费了13.6秒。@gbronner不错!我想测试
A[:,:,:::-1]会很有趣。Swapax(1,2)
也!@DivakarSwapax
似乎与转置(0,2,1)没有区别
@gbronner是的,功能上是一样的!对我来说不起作用。但是,我非常感谢您的回复。这并不能解决问题,它可以转换整个数组。实际上,它确实起作用。它非常难看。我提出了一个更简单更清晰的版本。说实话,flipud/fliplr语句似乎可以重新使用放置一个更通用的翻转轴,这将是更明显的一个从2到3维。
a=numpy.arange(48).reshape((4,4,3)
numpy.fliplr(a.swapaxes(1,2))
#or you could do
numpy.fliplr(a.transpose(0,2,1))