栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否有“增强型”的numpy / scipy点方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否有“增强型”的numpy / scipy点方法?

(w / r / t OP的最后一句话:我 知道这种numpy / scipy方法,但是w / r / t
OP标题中的问题(即,提高NumPy点的性能)应该是下面的内容换句话说,我的答案是针对改善 组成 Y)函数的大多数 步骤的 性能。

首先,这应该使您明显优于普通的NumPy 方法:

>>> from scipy.linalg import blas as FB>>> vx = FB.dgemm(alpha=1., a=v1, b=v2, trans_b=True)

请注意,两个数组v1,v2 按C_FORTRAN顺序排列

您可以通过数组的 flags 属性访问NumPy数组的字节顺序,如下所示:

>>> c = NP.ones((4, 3))>>> c.flags      C_ConTIGUOUS : True          # refers to C-contiguous order      F_ConTIGUOUS : False         # fortran-contiguous      OWNdata: True      MASKNA : False      OWNMASKNA : False      WRITEABLE : True      ALIGNED : True      UPDATEIFCOPY : False

更改数组之一的顺序以使两者对齐,只需调用NumPy数组构造函数,传入数组并将相应的 顺序 标志设置为True

>>> c = NP.array(c, order="F")>>> c.flags      C_ConTIGUOUS : False      F_ConTIGUOUS : True      OWNdata: True      MASKNA : False      OWNMASKNA : False      WRITEABLE : True      ALIGNED : True      UPDATEIFCOPY : False

您可以通过利用数组顺序对齐来进一步优化,以 减少由于 复制 原始数组而导致的过多内存消耗

但是为什么在传递给 之前复制数组?

点积依赖BLAS操作。这些操作需要以C连续顺序存储的数组-正是这种约束导致数组被复制。

在另一方面, 转置不会 影响副本,但不幸的返回结果中 的Fortran顺序

因此,要消除性能瓶颈,您需要 消除谓词数组复制步骤 ;为此,只需将两个数组以C连续的顺序传递给 点即可

因此,要计算 dot(AT,A) 而无需 额外复制:

>>> import scipy.linalg.blas as FB>>> vx = FB.dgemm(alpha=1.0, a=A.T, b=A.T, trans_b=True)

总之,上面的表达式(以及谓词import语句)可以代替点,以提供相同的功能但性能更好

您可以将该表达式绑定到如下函数:

>>> super_dot = lambda v, w: FB.dgemm(alpha=1., a=v.T, b=w.T, trans_b=True)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/647104.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号