numpy 反转多维数组

25 投票
3 回答
35766 浏览
提问于 2025-04-17 02:17

在numpy中,最简单的方法是什么,可以把一个数组里最里面的值反转,比如这样:

array([[[1, 1, 1, 2],
    [2, 2, 2, 3],
    [3, 3, 3, 4]],

   [[1, 1, 1, 2],
    [2, 2, 2, 3],
    [3, 3, 3, 4]]])

这样我就能得到以下结果:

array([[[2, 1, 1, 1],
    [3, 2, 2, 2],
    [4, 3, 3, 3]],

   [[2, 1, 1, 1],
    [3, 2, 2, 2],
    [4, 3, 3, 3]]])

非常感谢!

3 个回答

0

你可以很简单地使用 numpy.flip() 来实现这个功能:

import numpy as np
a = np.array([[[1, 1, 1, 2],
               [2, 2, 2, 3],
               [3, 3, 3, 4]],
              [[1, 1, 1, 2],
               [2, 2, 2, 3],
               [3, 3, 3, 4]]])
print(np.flip(a, axis=2))

这样就得到了:

array([[[2, 1, 1, 1],
        [3, 2, 2, 2],
        [4, 3, 3, 3]],
       [[2, 1, 1, 1],
        [3, 2, 2, 2],
        [4, 3, 3, 3]]])

正如你所需要的那样。输入的数组是三维的,因为多了额外的方括号。所以,沿着 axis=2 翻转,意味着翻转第三个轴(因为计数是从0开始的)。

请注意,这个操作返回的是一个视图,而不是一个副本(详细信息请查看 文档)。

1

对于每个内部数组,你可以使用 fliplr 这个功能。它会把每一行的内容左右翻转。列的顺序会保持不变,但显示的顺序会变。

示例用法:

import numpy as np
initial_array = np.array([[[1, 1, 1, 2],
                          [2, 2, 2, 3],
                          [3, 3, 3, 4]],
                         [[1, 1, 1, 2],
                          [2, 2, 2, 3],
                          [3, 3, 3, 4]]])
index=0
initial_shape = initial_array.shape
reversed=np.empty(shape=initial_shape)
for inner_array in initial_array:
    reversed[index] = np.fliplr(inner_array)
    index += 1

打印翻转后的内容

输出结果:

array([[[2, 1, 1, 1],
        [3, 2, 2, 2],
        [4, 3, 3, 3]],
       [[2, 1, 1, 1],
        [3, 2, 2, 2],
        [4, 3, 3, 3]]])

确保你传给 fliplr 函数的数组至少是二维的。

另外,如果你想要把数组上下翻转,可以使用 flipud

42

这样怎么样:

import numpy as np
a = np.array([[[10, 1, 1, 2],
               [2, 2, 2, 3],
               [3, 3, 3, 4]],
              [[1, 1, 1, 2],
               [2, 2, 2, 3],
               [3, 3, 3, 4]]])

而在最后一个维度上的反向操作是:

b = a[:,:,::-1]

或者

b = a[...,::-1]

不过我更不喜欢后面的那个,因为前两个维度是隐含的,这样就更难看出发生了什么。

撰写回答