在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.:这个问题不是转置NumPy阵列的重复。本问题不是质疑“转置”函数的稳定性,而是要求函数本身。
发布于 2016-06-28 22:31:05
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)只是更改数组的.shape和strides属性;它是视图,而不是副本。
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的值。尽管使用了两个函数,x仍然是一个view of ar。
这两个函数是不需要的,但它们也没有那么昂贵。我们说的是毫秒v纳秒的时间。(我在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发布于 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。只要可能,都会返回视图。发布于 2016-06-28 20:51:48
那将是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]])https://stackoverflow.com/questions/38086005
复制相似问题