我有一些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, :, :])
答案 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
都会为您提供最有效的版本。