gpt4 book ai didi

Python:numpy数组的外积的所有排列的总和

转载 作者:行者123 更新时间:2023-12-01 09:02:42 24 4
gpt4 key购买 nike

我有一个数组 Ai 的 numpy 数组,我希望每个外部乘积 (np.outer(Ai[i],Ai[j])) 与缩放乘数相加以产生 H。我可以逐步执行并制作然后用缩放因子矩阵对它们进行张排序。我认为事情可以大大简化,但还没有找到一种通用/有效的方法来为 ND 做到这一点。如何更容易地生成Arr2D和H?注意:Arr2D 可以是 64 个 2D 数组,而不是 8x8 2D 数组。

Ai = np.random.random((8,101))
Arr2D = np.zeros((Ai.shape[0], Ai.shape[0], Ai.shape[1], Ai.shape[1]))
Arr2D[:,:,:,:] = np.asarray([ np.outer(Ai[i], Ai[j]) for i in range(Ai.shape[0])
for j in range(Ai.shape[0]) ]).reshape(Ai.shape[0],Ai.shape[0],Ai[0].size,Ai[0].size)
arr = np.random.random( (Ai.shape[0] * Ai.shape[0]) )
arr2D = arr.reshape(Ai.shape[0], Ai.shape[0])
H = np.tensordot(Arr2D, arr2D, axes=([0,1],[0,1]))

最佳答案

利用einsum的良好设置!

np.einsum('ij,kl,ik->jl',Ai,Ai,arr2D,optimize=True)

时间安排 -

In [71]: # Setup inputs
...: Ai = np.random.random((8,101))
...: arr = np.random.random( (Ai.shape[0] * Ai.shape[0]) )
...: arr2D = arr.reshape(Ai.shape[0], Ai.shape[0])

In [74]: %%timeit # Original soln
...: Arr2D = np.zeros((Ai.shape[0], Ai.shape[0], Ai.shape[1], Ai.shape[1]))
...: Arr2D[:,:,:,:] = np.asarray([ np.outer(Ai[i], Ai[j]) for i in range(Ai.shape[0])
...: for j in range(Ai.shape[0]) ]).reshape(Ai.shape[0],Ai.shape[0],Ai[0].size,Ai[0].size)
...: H = np.tensordot(Arr2D, arr2D, axes=([0,1],[0,1]))
100 loops, best of 3: 4.5 ms per loop

In [75]: %timeit np.einsum('ij,kl,ik->jl',Ai,Ai,arr2D,optimize=True)
10000 loops, best of 3: 146 µs per loop

30x+ 加速!

关于Python:numpy数组的外积的所有排列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52350481/

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