Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy性能-向量与其转置的外积_Python_Numpy_Vector_Transpose - Fatal编程技术网

Python Numpy性能-向量与其转置的外积

Python Numpy性能-向量与其转置的外积,python,numpy,vector,transpose,Python,Numpy,Vector,Transpose,我的理解是,向量与其转置的外积在值上是对称的 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],

我的理解是,向量与其转置的外积在值上是对称的


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.T
Out[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.T
36.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使用转置捷径吗?我不这么认为,或者如果它真的这样做了,在这种情况下也没有帮助。我有点惊讶,圆点跑得慢

In [170]: x2=x1.T
In [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)
带有x1和x2的einsum具有相同的时间

有趣的是,matmul和einsum做得一样好。在这种情况下,einsum可能会委托给matmul

演示dot如何通过巧妙地使用1000x1000阵列来节省时间


正如链接中所讨论的,dot可以通过检查数据缓冲区指针、形状和步幅来检测何时一个参数是另一个参数的转置,并且可以使用针对对称计算优化的BLAS函数。但我看不到有证据表明外星生物会这么做。广播乘法不太可能采取这样的步骤。

你把外积叫做什么?据我所知,两个向量的外积不是对称的。谢谢,我编辑了这个问题。我指的是一个向量的外积和它自己的转置:a*a.t什么是向量?这在numpy中并没有正式定义,请给出一个计算示例。做一些时间测试。点可以检测转置,比如用n,1和1,n@hpaulj根据这个链接,dot产品已经做到了这一点,但不确定外部产品:非常感谢您的详细分析。。。到目前为止,matmul和einsum似乎比其他替代品更快。。。我想知道当我们将数据扩展到数百万个32位浮点值时,它们是否保持快速。。。
In [178]: timeit x1@x2
27.3 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [179]: timeit x1@x1.T
27.2 µs ± 14.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)