首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >翻转和旋转numpy阵列

翻转和旋转numpy阵列
EN

Stack Overflow用户
提问于 2016-06-28 20:46:26
回答 3查看 7.2K关注 0票数 2

在numpy中有更快的翻转和旋转数组的方法吗?例如,顺时针旋转一次,然后翻转?

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
[[  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.:这个问题不是转置NumPy阵列的重复。本问题不是质疑“转置”函数的稳定性,而是要求函数本身。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-28 22:31:05

np.rot90的代码是这样的,以k=3为例

代码语言:javascript
复制
    # k == 3
    return fliplr(m.swapaxes(0, 1))

所以

代码语言:javascript
复制
In [789]: np.fliplr(ar.swapaxes(0, 1))
Out[789]: 
array([[-11,   0],
     ...
       [ -3,   8],
       [ -2,   9]])

所以你的

代码语言:javascript
复制
fliplr(rot90(ar, 3))

变成了

代码语言:javascript
复制
 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

代码语言:javascript
复制
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的值。尽管使用了两个函数,x仍然是一个view of ar

这两个函数是不需要的,但它们也没有那么昂贵。我们说的是毫秒v纳秒的时间。(我在Ipython中的timeit次数要小得多)

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2016-06-28 20:50:50

翻转和旋转在一起(根据您的例子)是一个https://en.wikipedia.org/wiki/Matrix_transpose:矩阵转置是矩阵维度的排列:例如,第一个维度变成第二个维度,反之亦然。

numpy支持numpy.transpose函数:

numpy.transpose(a,axes=None) 排列数组的尺寸。 参数

  • a : array_like:输入数组。
  • axes:默认情况下可选的ints列表,反转尺寸,否则根据给定的值更改轴。

返回

  • p : ndarray:用轴排列的a。只要可能,都会返回视图。
票数 2
EN

Stack Overflow用户

发布于 2016-06-28 20:51:48

那将是transpose

代码语言:javascript
复制
>>> 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]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38086005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档