gpt4 book ai didi

python - numpy.outer() 真的比转置快吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:26 26 4
gpt4 key购买 nike

我正在编写一个距离矩阵,最终生成了以下代码

In [83]: import numpy as np

In [84]: np.set_printoptions(linewidth=120,precision=2)

In [85]: n = 7 ; a = np.arange(n) ; o = np.ones(n) ; np.sqrt(np.outer(o,a*a)+np.outer(a*a,o))
Out[85]:
array([[ 0. , 1. , 2. , 3. , 4. , 5. , 6. ],
[ 1. , 1.41, 2.24, 3.16, 4.12, 5.1 , 6.08],
[ 2. , 2.24, 2.83, 3.61, 4.47, 5.39, 6.32],
[ 3. , 3.16, 3.61, 4.24, 5. , 5.83, 6.71],
[ 4. , 4.12, 4.47, 5. , 5.66, 6.4 , 7.21],
[ 5. , 5.1 , 5.39, 5.83, 6.4 , 7.07, 7.81],
[ 6. , 6.08, 6.32, 6.71, 7.21, 7.81, 8.49]])

我告诉自己“你在浪费一个外部产品,你这个傻瓜!保存其中一个并使用转置!”,那是我写的

In [86]: n = 7 ; a = np.outer(np.arange(n)**2, np.ones(n)) ; np.sqrt(a+a.T)
Out[86]:
array([[ 0. , 1. , 2. , 3. , 4. , 5. , 6. ],
[ 1. , 1.41, 2.24, 3.16, 4.12, 5.1 , 6.08],
[ 2. , 2.24, 2.83, 3.61, 4.47, 5.39, 6.32],
[ 3. , 3.16, 3.61, 4.24, 5. , 5.83, 6.71],
[ 4. , 4.12, 4.47, 5. , 5.66, 6.4 , 7.21],
[ 5. , 5.1 , 5.39, 5.83, 6.4 , 7.07, 7.81],
[ 6. , 6.08, 6.32, 6.71, 7.21, 7.81, 8.49]])

到目前为止,非常好,我有两个(略有)不同的相同想法的实现,一个明显比另一个快,不是吗?

In [87]: %timeit n = 1001 ; a = np.arange(n) ; o = np.ones(n) ; np.sqrt(np.outer(o,a*a)+np.outer(a*a,o))
100 loops, best of 3: 13.7 ms per loop

In [88]: %timeit n = 1001 ; a = np.outer(np.arange(n)**2, np.ones(n)) ; np.sqrt(a+a.T)
10 loops, best of 3: 19.7 ms per loop

In [89]:

不!越快的实现速度越慢 50%!

问题

我对我刚刚发现的行为感到惊讶,我的惊讶有错吗?换句话说,不同时间安排背后的基本原理是什么?

最佳答案

下面是小n=7的一些时间:

In [784]: timeit np.outer(o,a*a)
10000 loops, best of 3: 24.2 µs per loop

In [785]: timeit np.outer(a*a,o)
10000 loops, best of 3: 25.7 µs per loop

In [786]: timeit np.outer(a*a,o)+np.outer(o,a*a)
10000 loops, best of 3: 52.7 µs per loop

2个outer耗时相同,总和比加起来的时间多一点。

In [787]: timeit a2=np.outer(a*a,o); a2+a2.T
10000 loops, best of 3: 33.2 µs per loop

In [788]: timeit a2=np.outer(a*a,o); a2+a2
10000 loops, best of 3: 27.9 µs per loop

In [795]: timeit a2=np.outer(a*a,o); a2.T+a2.T
10000 loops, best of 3: 29.4 µs per loop

比较这 2 个,我们看到将 a2.T 添加到 a2 比将 a2 添加到自身,甚至是 a2 .T 到它自己。执行转置很便宜,只是改变形状和步幅的问题。但是混合步幅的迭代速度较慢。迭代器甚至可以使用临时缓冲区。

因此,在我的时间安排中,一些时间会预先计算外部,但没有人们预期的那么多。

对于较大的 n,2 个 (n,n) 数组的总和与生成它们所用的时间大致相同。因此,预计算 outer 的相对优势降低了。


outera*a.T 的先前比较已省略。

关于python - numpy.outer() 真的比转置快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29125729/

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