如何在Python中执行最佳的反转置操作?

15

假设我有一个数组

a = np.arange(16).reshape((4,4))

0   1  2   3
4   5  6   7
8   9  10  11
12  13 14  15

但是我希望

15  11  7  3
14  10  6  2
13  9   5  1
12  8   4  0

使用numpy如何完成这个操作:对角线翻转,或称反转置。


你有尝试过做这个任务吗,还是只是让我们帮你完成作业? - Vaibhav Bajaj
@VaibhavBajaj 自问自答的问题 - Antti Haapala -- Слава Україні
@AnttiHaapala :O 哎呀,不好意思,我没看到。 - Vaibhav Bajaj
4个回答

19

以下是几种可能的方法:

rot90(a,2).T

rot90(flipud(a),1)

rot90(fliplr(a),-1)

或者,如hpaulj在评论中建议的(感谢hpaulj)

a[::-1,::-1].T

这里是速度排名,以最慢的方法为基准,反转1000个随机的10000x10000数组后进行反转。

  1. 63.5% - a[::-1,::-1].T
  2. 85.6% - rot90(a,2).T
  3. 97.8% - rot90(flipud(a),1)
  4. 100% -rot90(fliplr(a),-1)

我希望有人知道一种秘密的numpy方法来做这件事。 - Jaden Travnik
7
a[::-1,::-1].T是一个“视图”,它共享相同的数据缓冲区,因此速度非常快。为了测试是否为视图,请尝试更改一个元素并查看是否更改了原始数组。双重反转切片与np.rot90(a,2)相同。查看它的代码即可。 - hpaulj
@hpaulj 所以你应该将其添加为答案。 - Antti Haapala -- Слава Україні

2

np.flip(a).T

来自np.flip文档和@hpaulj的评论:

flip(m)对应于m[::-1,::-1,...,::-1],其中所有位置都是::-1。


1
这是另一个要加入混合的元素。
a.ravel('F')[::-1].reshape(a.shape)

虽然我喜欢这个函数因为它可以解决旋转问题,但是它的速度比 rot90(fliplr(a),-1) 慢了大约200倍。 :/ - Jaden Travnik
没关系,我只是在探索其他做法 (-: - piRSquared

0

以这种方式尝试一下:

np=np[::-1] #reverse the array
a = np.arange(16).reshape((4,4))

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