假设我有一个数组
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如何完成这个操作:对角线翻转,或称反转置。
假设我有一个数组
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如何完成这个操作:对角线翻转,或称反转置。
以下是几种可能的方法:
rot90(a,2).T
rot90(flipud(a),1)
rot90(fliplr(a),-1)
或者,如hpaulj在评论中建议的(感谢hpaulj)
a[::-1,::-1].T
这里是速度排名,以最慢的方法为基准,反转1000个随机的10000x10000数组后进行反转。
a[::-1,::-1].T
rot90(a,2).T
rot90(flipud(a),1)
rot90(fliplr(a),-1)
a[::-1,::-1].T
是一个“视图”,它共享相同的数据缓冲区,因此速度非常快。为了测试是否为视图,请尝试更改一个元素并查看是否更改了原始数组。双重反转切片与np.rot90(a,2)
相同。查看它的代码即可。 - hpauljnp.flip(a).T
来自np.flip
文档和@hpaulj的评论:
flip(m)对应于m[::-1,::-1,...,::-1],其中所有位置都是::-1。
a.ravel('F')[::-1].reshape(a.shape)
rot90(fliplr(a),-1)
慢了大约200倍。 :/ - Jaden Travnik以这种方式尝试一下:
np=np[::-1] #reverse the array
a = np.arange(16).reshape((4,4))