【问题标题】:Flip and rotate numpy array翻转和旋转 numpy 数组
【发布时间】:2016-06-28 20:46:26
【问题描述】:

有没有更快的方法在 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。目前的问题不质疑“转置”功能的稳定性;它要求函数本身。

【问题讨论】:

  • np.transpose(),别名ar.T

标签: python arrays numpy


【解决方案1】:

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 仍然是 arview

这 2 个函数不是必需的,但它们也不是那么昂贵。我们说的是微秒和纳秒的时间。 (我在 Ipython 中的 timeit 时间比你的要小得多)

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

【讨论】:

  • 恭喜您展示了速度有多快。
【解决方案2】:

一起翻转和旋转(基于您的示例)是matrix transpose:矩阵转置是矩阵维度的排列:例如,第一个维度变为第二个维度,反之亦然。

支持numpy.transpose 功能:

numpy.transpose(a, axes=None)

置换数组的维度。

参数

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

返回

  • p : ndarray:a 轴已置换。尽可能返回视图。

【讨论】:

    【解决方案3】:

    那就是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]])
    

    【讨论】:

      猜你喜欢
      • 2018-01-13
      • 2013-01-04
      • 2017-01-14
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多