gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:03 26 4
gpt4 key购买 nike

假设我有 9 个大小为 N 的数组(A、B、C、.. J)。我想创建一个包含 N 个 3x3 矩阵的新数组,例如

matrices[i] = [[A[i], B[i], C[i]],
[D[i], E[i], F[i]],
[G[i], H[i], J[i]]]

一个简单的解决方案是在 for 循环中将每个条目添加到数组 matrices 中:

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 循环来完成这项工作吗?如果存在一些智能索引操作什么的。

最佳答案

一种方法是用 np.column_stack 将它们堆叠在列中并用 np.reshape reshape -

np.column_stack((A,B,C,D,E,F,G,H,J)).reshape(-1,3,3)

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

np.concatenate((A,B,C,D,E,F,G,H,J)).reshape(9,-1).T.reshape(-1,3,3)

另一个带有 np.concatenate3D 转置 和 reshape -

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

关于python - 如何从 9 个大小为 N 的数组快速创建 N 个 3x3 矩阵的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32697193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com