2016-06-28 372 views
1

是否有更快的方式翻转和旋转数组numpy?例如,顺时针旋转一次然后翻转?翻转和旋转numpy阵列

import numpy as np 
a = np.arange(0,10) 
b = np.arange(-11,-1) 

ar = np.array([a,b]) 

print ar 
print ar.shape 

ar = np.rot90(ar, 3) 
print np.fliplr(ar) 
print ar.shape 

输出:

[[ 0 1 2 3 4 5 6 7 8 9] 
[-11 -10 -9 -8 -7 -6 -5 -4 -3 -2]] 
(2, 10) 

[[ 0 -11] 
[ 1 -10] 
[ 2 -9] 
[ 3 -8] 
[ 4 -7] 
[ 5 -6] 
[ 6 -5] 
[ 7 -4] 
[ 8 -3] 
[ 9 -2]] 
(10, 2) 
[Finished in 0.1s] 

P.S:这个问题是不是重复:Transposing a NumPy array。目前的问题并不反对“转置”功能的稳定性;它正在请求函数本身。

+2

'np.transpose()',别名'ar.T'。 –

回答

2

np.rot90的代码做,在你的k=3情况:

# k == 3 
    return fliplr(m.swapaxes(0, 1)) 

所以

In [789]: np.fliplr(ar.swapaxes(0, 1)) 
Out[789]: 
array([[-11, 0], 
    ... 
     [ -3, 8], 
     [ -2, 9]]) 

所以你

fliplr(rot90(ar, 3)) 

成为

np.fliplf(np.fliplr(ar.swapaxes(0, 1))) 
# the flips cancel 
ar.swapaxes(0,1) 
# but this is just 
ar.T 

所以你对行动减少转。

transpose(和swap)只是改变阵列的.shapestrides属性;这是一种观点,而不是副本。

np.fliplr也创建一个视图,与[:,::-1]改变步伐。

ar

In [818]: ar 
Out[818]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [-11, -10, -9, -8, -7, -6, -5, -4, -3, -2]]) 

In [819]: x=np.fliplr(np.rot90(ar,3)) # your pair of actions 

In [820]: x 
Out[820]: 
array([[ 0, -11], 
     [ 1, -10], 
     ... 
     [ 8, -3], 
     [ 9, -2]]) 

In [821]: x[0,1]=11 

In [822]: x 
Out[822]: 
array([[ 0, 11], 
     [ 1, -10], 
     ... 
     [ 9, -2]]) 

In [823]: ar 
Out[823]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [ 11, -10, -9, -8, -7, -6, -5, -4, -3, -2]]) 

更改的x的值改变的ar的值。尽管使用了2个功能,但x仍然是viewar

2功能不是必需的,但它们也不是那么昂贵。我们正在谈论微秒v纳秒的时间。 (我的timeit次在Ipython是你的小得多)

In [824]: timeit np.fliplr(np.rot90(ar,3)) 
100000 loops, best of 3: 8.28 µs per loop 

In [825]: timeit ar.T 
1000000 loops, best of 3: 455 ns per loop 
+0

祝贺您演示速度如何。 – cpicanco

1

翻转和一起旋转(基于你的例子)是一个matrix transpose:矩阵转置是矩阵的尺寸的置换:例如第一个维度变成第二维度,反之亦然。

支持numpy.transpose功能:

numpy.transpose(a, axes=None) 

置换的阵列的尺寸。

参数

  • a : array_like:输入数组。
  • axes:整数列表,可选 默认情况下,反转尺寸,否则根据给定的值对轴进行置换。

返回

  • p : ndarray:一个与它的轴线排列。尽可能返回视图。
1

这将是transpose

>>> import numpy as np 
>>> a = np.arange(0,10) 
>>> b = np.arange(-11,-1) 
>>> ar = np.array([a,b]) 
>>> ar.T 
array([[ 0, -11], 
     [ 1, -10], 
     [ 2, -9], 
     [ 3, -8], 
     [ 4, -7], 
     [ 5, -6], 
     [ 6, -5], 
     [ 7, -4], 
     [ 8, -3], 
     [ 9, -2]]) 
>>> np.transpose(ar) 
array([[ 0, -11], 
     [ 1, -10], 
     [ 2, -9], 
     [ 3, -8], 
     [ 4, -7], 
     [ 5, -6], 
     [ 6, -5], 
     [ 7, -4], 
     [ 8, -3], 
     [ 9, -2]])