Python 如何通过'np.rot90'高效地旋转不同时间的方形numpy阵列?

Python 如何通过'np.rot90'高效地旋转不同时间的方形numpy阵列?,python,arrays,performance,numpy,rotation,Python,Arrays,Performance,Numpy,Rotation,我有一个2d numpy数组,例如: a = np.array([ [0, 1, 2], [3, 4, 5], [6, 7, 8]]) 和另一个1d阵列: I = np.array([0, 2, 3, 1, 0, 2, 0, 1]) 我想通过np.rot90函数旋转a,如下所示: b = np.zeros((len(I), 3, 3)) for i, k in enumerate(I): b[i] = np.rot90(a, k=k)

我有一个2d numpy数组,例如:

a = np.array([
        [0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
和另一个1d阵列:

I = np.array([0, 2, 3, 1, 0, 2, 0, 1])
我想通过
np.rot90
函数旋转
a
,如下所示:

b = np.zeros((len(I), 3, 3))
for i, k in enumerate(I):
    b[i] = np.rot90(a, k=k)

没有floop我能更有效地完成吗?

我能想到的一种更有效的方法(仍然没有矢量化)是使用列表理解,在一行中:

np.array([np.rot90(a, k=i) for i in I])
方法#1

生成一个包含所有可能的
4
旋转的
3D
数组,并简单地使用
I
索引到该数组中,从而获得矢量化解决方案-

P = np.empty((4,) + a.shape, dtype=a.dtype)
P[0] = a            # For np.rot90(a, k=0)
P[1] = a.T[::-1]    # For np.rot90(a, k=1)
P[2] = a[::-1,::-1] # For np.rot90(a, k=2)
P[3] = a.T[:,::-1]  # For np.rot90(a, k=3)
out = P[I]
方法#2

创建
p
的另一种方法是-

P = np.array([np.rot90(a, k=i) for i in range(4)])
与前面的方法一样,只需将
p
I
索引,即可获得最终输出

运行时测试

接近-

def org_app(a, I):
    m,n = a.shape
    b = np.zeros((len(I), m, n), dtype=a.dtype)
    for i, k in enumerate(I):
        b[i] = np.rot90(a, k=k)
    return b

def app1(a, I):
    P = np.empty((4,) + a.shape, dtype=a.dtype)
    P[0] = a  
    P[1] = a.T[::-1]
    P[2] = a[::-1,::-1]
    P[3] = a.T[:,::-1]
    return P[I]

def app2(a, I):
    P = np.array([np.rot90(a, k=i) for i in range(4)])
    return P[I]
时间安排-

In [54]: a = np.random.randint(0,9,(10,10))

In [55]: I = np.random.randint(0,4,(10000))

In [56]: %timeit org_app(a, I)
10 loops, best of 3: 51 ms per loop

In [57]: %timeit app1(a, I)
1000 loops, best of 3: 469 µs per loop

In [58]: %timeit app2(a, I)
1000 loops, best of 3: 549 µs per loop

100x+
加速

发布的解决方案中有一个对你有效吗?是的,它们对我有效。非常感谢。考虑接受其中的一个吗?我喜欢方法2,因为它有很好的可读性。我的意思是通过点击绿色刻度来接受其中一个解决方案,就像你之前对这个解决方案所做的那样。