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

numpy性能-向量及其转置的外积

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

numpy性能-向量及其转置的外积

探索一些替代方法:

In [162]: x=np.arange(100)In [163]: np.outer(x,x)Out[163]: array([[   0,    0,    0, ...,    0,    0,    0],       [   0,    1,    2, ...,   97,   98,   99],       [   0,    2,    4, ...,  194,  196,  198],       ...,       [   0,   97,  194, ..., 9409, 9506, 9603],       [   0,   98,  196, ..., 9506, 9604, 9702],       [   0,   99,  198, ..., 9603, 9702, 9801]])In [164]: x1=x[:,None]In [165]: x1*x1.TOut[165]: array([[   0,    0,    0, ...,    0,    0,    0],       [   0,    1,    2, ...,   97,   98,   99],       [   0,    2,    4, ...,  194,  196,  198],       ...,       [   0,   97,  194, ..., 9409, 9506, 9603],       [   0,   98,  196, ..., 9506, 9604, 9702],       [   0,   99,  198, ..., 9603, 9702, 9801]])In [166]: np.dot(x1,x1.T)Out[166]: array([[   0,    0,    0, ...,    0,    0,    0],       [   0,    1,    2, ...,   97,   98,   99],       [   0,    2,    4, ...,  194,  196,  198],       ...,       [   0,   97,  194, ..., 9409, 9506, 9603],       [   0,   98,  196, ..., 9506, 9604, 9702],       [   0,   99,  198, ..., 9603, 9702, 9801]])

比较他们的时间:

In [167]: timeit np.outer(x,x)40.8 µs ± 63.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)In [168]: timeit x1*x1.T36.3 µs ± 22 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)In [169]: timeit np.dot(x1,x1.T)60.7 µs ± 6.86 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

dot
使用转捷径?我不这么认为,或者如果这样做,在这种情况下它没有帮助。有点
dot
慢,我有点惊讶。

In [170]: x2=x1.TIn [171]: timeit np.dot(x1,x2)61.1 µs ± 30 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

另一种方法

In [172]: timeit np.einsum('i,j',x,x)28.3 µs ± 19.4 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

einsum
x1
x2
具有相同的时间。

有趣的是

matmul
einsum
在这种情况下(也许
einsum
委派给
matmul
?)

In [178]: timeit x1@x227.3 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)In [179]: timeit x1@x1.T27.2 µs ± 14.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

numpy高效矩阵自乘法(语法矩阵)演示了如何

dot
通过聪明(对于1000x1000数组)来节省时间。

如链接中所述,

dot
可以检测一个参数何时是另一个参数的转置(可能通过检查数据缓冲区指针以及形状和步幅),并且可以使用针对对称计算优化的BLAS函数。但是我没有
outer
这样做的证据。而且广播乘法不可能采取这样的步骤。



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

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

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