3D numpy数组的高效转换

时间:2016-12-24 00:17:55

标签: python arrays numpy matrix 3d

我有一些3D numpy数组需要以各种方式进行转换。 E.g:

x.shape = (4, 17, 17)

此阵列是4个平面的1个样本,每个平面大小为17x17。变换每个平面的最有效方法是什么:flipud,fliplr和rot90?有没有比使用for循环更好的方法?谢谢!

for p in range(4):
    x[p, :, :] = np.fliplr(x[p, :, :])

1 个答案:

答案 0 :(得分:1)

查看这些函数的代码:

def fliplr(...):
   ....
   return m[:, ::-1]

换句话说,它返回一个在第二维上反向切片的视图

您的x[p, :, :] = np.fliplr(x[p, :, :]将反向切片应用于最后一个维度,因此整个数组的等效值应为

x[:, :, ::-1]

翻转第二轴将是

x[:, ::-1, :]

np.rot90有4个案例(k);对于k=1,它是

return fliplr(m).swapaxes(0, 1)

换句话说m[:, ::-1].swapaxes(0,1)

要在你的飞机上工作,你会做类似

的事情
m[:, :,::-1].swapaxes(1,2)

或者你可以先swapaxes/transpose

m.transpose(0,2,1)[:, :, ::-1]

这能为您提供足够的工具来以您想要的方式转换飞机吗?

正如我在最近的另一个问题https://stackoverflow.com/a/41291462/901925中所讨论的那样,flip...会返回一个视图,但rot90(包括翻转和交换)很可能会返回一个副本。无论哪种方式,numpy都会为您提供最有效的版本。