首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: numpy数组的外部积的所有排列之和

Python: numpy数组的外部积的所有排列之和
EN

Stack Overflow用户
提问于 2018-09-16 02:29:23
回答 1查看 119关注 0票数 1

我有一个数字数组,Ai和我希望每个外部积(np.outer(Aii,Aij))被用一个比例乘数相加产生H。我可以让它们通过,然后用一个缩放因子的矩阵来拉紧它们。我认为事情可以大大简化,但还没有找到一个通用/有效的方法来实现ND。如何更容易地生产Arr2D和H?注意: Arr2D可以是64个2D数组,而不是8x82D数组。

代码语言:javascript
复制
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]))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-16 05:51:55

良好的设置,利用einsum

代码语言:javascript
复制
np.einsum('ij,kl,ik->jl',Ai,Ai,arr2D,optimize=True)

时间安排-

代码语言:javascript
复制
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+加速了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52350481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档