Python 如何从大小为N的9个数组中快速创建N 3x3矩阵数组?

Python 如何从大小为N的9个数组中快速创建N 3x3矩阵数组?,python,arrays,numpy,matrix,vectorization,Python,Arrays,Numpy,Matrix,Vectorization,假设我有9个大小为N的数组(A,B,C,…J)。我想创建一个由n3x3矩阵组成的新数组,例如 matrices[i] = [[A[i], B[i], C[i]], [D[i], E[i], F[i]], [G[i], H[i], J[i]]] 一个简单的解决方案是在for循环中将每个条目添加到数组矩阵中,如下所示: for i in range(len(matrices)): matrices[i] = [[A[i], B[i

假设我有9个大小为N的数组(A,B,C,…J)。我想创建一个由n3x3矩阵组成的新数组,例如

matrices[i] = [[A[i], B[i], C[i]],
               [D[i], E[i], F[i]],
               [G[i], H[i], J[i]]]
一个简单的解决方案是在for循环中将每个条目添加到数组
矩阵中,如下所示:

for i in range(len(matrices)):
    matrices[i] = [[A[i], B[i], C[i]],
            [D[i], E[i], F[i]],
            [G[i], H[i], J[i]]]

有人知道如何以更快、矢量化的方式避免for循环吗?如果存在一些智能索引操作或其他操作。

一种方法是将列中的这些操作堆叠在一起,并用-

众所周知,与连接的速度要快得多,因此将其与
2D转置
和整形一起使用-

np.concatenate((A,B,C,D,E,F,G,H,J)).reshape(9,-1).T.reshape(-1,3,3)
np.concatenate((A,B,C,D,E,F,G,H,J)).reshape(3,3,-1).transpose(2,0,1)
另一个带有
np.连接
3D转置
和整形-

np.concatenate((A,B,C,D,E,F,G,H,J)).reshape(9,-1).T.reshape(-1,3,3)
np.concatenate((A,B,C,D,E,F,G,H,J)).reshape(3,3,-1).transpose(2,0,1)
运行时测试-

In [59]: # Setup input arrays
    ...: N = 1000
    ...: A = np.random.randint(0,9,(N,))
    ...: B = np.random.randint(0,9,(N,))
    ...: C = np.random.randint(0,9,(N,))
    ...: D = np.random.randint(0,9,(N,))
    ...: E = np.random.randint(0,9,(N,))
    ...: F = np.random.randint(0,9,(N,))
    ...: G = np.random.randint(0,9,(N,))
    ...: H = np.random.randint(0,9,(N,))
    ...: J = np.random.randint(0,9,(N,))
    ...: 

In [60]: %timeit np.column_stack((A,B,C,D,E,F,G,H,J)).reshape(-1,3,3)
10000 loops, best of 3: 84.4 µs per loop

In [61]: %timeit np.concatenate((A,B,C,D,E,F,G,H,J)).reshape(9,-1).T.reshape(-1,3,3)
100000 loops, best of 3: 15.8 µs per loop

In [62]: %timeit np.concatenate((A,B,C,D,E,F,G,H,J)).reshape(3,3,-1).transpose(2,0,1)
100000 loops, best of 3: 14.8 µs per loop

这是一个伟大的解决方案,速度是巨大的!谢谢!:-)尝试将其计时到,如果所有阵列包含5000万个元素,则第一个解决方案大约需要7秒,第二个解决方案需要3秒。伟大的再次感谢大家@塞尔文:是的,得到了类似的结果,我刚刚补充说。