Python NumPy将列转换为行

3

我需要翻译的内容是: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]]]

注意:真正的矩阵将具有实际数据,而不是连续的数字。
我需要旋转、翻转或其他操作(我已经尝试了所有方法),以便最终得到这个结果:
[[[ 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]]]

基本上,我需要整个矩阵的列变成行。
谢谢。
4个回答

3

使用 [:,:,::-1] 可以翻转列的位置,并且使用 np.transpose 将行和列进行交换 -

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]]])

谢谢。我很感激。我确实尝试过切片和转置,但没有同时使用这两种方法。 - JayJay123
我测试了这种方法和另一种方法(fliplr(a).transpose(0,2,1) 和 f(f(f(a).T).T).transpose(0,2,1)),发现使用 timeit 模块,这种方法花费了 5.3 秒;fliplr 方法花费了 8.3 秒,而最后一种方法花费了 13.6 秒。 - gbronner
@gbronner 不错!我猜测试一下 A[:,:,::-1].swapaxes(1,2) 也会很有趣! - Divakar
@Divakar,“swapaxes”似乎与“transpose(0,2,1)”无法区分。 - gbronner
@gbronner 是的,从功能上来说它们是相同的! - Divakar

2
这里有一种更简单的方法来完成它:
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维度即可解决问题。
祝使用愉快。

1

对于您的超级数组中的每个2d子数组,您可以应用numpy函数:

np.rot90()http://docs.scipy.org/doc/numpy/reference/generated/numpy.rot90.html

因此:

import numpy as np

array= np.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]]])

desired_output = np.array([np.rot90(sub_array) for sub_array in array])

0

transposeflipud是您要寻找的内容;swapaxes也可以作为转置功能。

请注意,转置有一个可操作多个维度的版本。

可能有更简单的表达方式,但这种方法的优点是不使用复杂的索引。例如,在Python 2.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]]])

.


对我没有起作用。不过,我很感谢您的回复。 - JayJay123
这并不能解决问题,它是对整个数组进行了转置。 - wwii
实际上,它确实可以工作。只是非常丑陋。我想出了一个更简单的版本,更清晰易懂。说实话,flipud/fliplr语句似乎可以用更通用的轴翻转替换,这样从2维到3维会更明显。 - gbronner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接