繁体   English   中英

优化Numpy的向量归一化

[英]Optimizing Vector Normalization on Numpy

我正在使用numpy模拟N维空间。 请注意,与现有软件相比,我并没有认真尝试做一些有效的事情,我只是想在这里学习一些东西。

也就是说,我仍然对设计此算法的最佳方法感到好奇。

空间模拟往往需要大量的归一化计算。

因此,让我们假设,要处理1秒钟的模拟,计算机需要进行100次归一化计算。

Numpy能够一次将大量向量归一化。 而且我猜想,一次运行100个规范的计算会快得多,而每次运行100个规范的1个规范会更快。

保留“要归一化的向量”的全局列表,然后在模拟的每一秒结束时一次全部处理它们是否有意义? 还是这种方法的好处不是很重要?

我猜想这完全取决于与运行计算相关的开销。 我在正确的轨道上吗?

如果不执行任何时序测试(您一定要自己做),我会说,将所有向量累加到更大的数组中,然后通过一次调用numpy的norm函数来处理所有向量会更快。 我怀疑将这些向量分配给累加器数组的相应元素所花费的时间少于numpy norm所使用的开销。 这都是基于我的“直觉”,应该进行时间测试。

计时测试:

In [1]: import numpy as np

In [2]: def f1(vectors):
   ...:     vectors = np.asarray(vectors, dtype=np.float64)
   ...:     acc = np.empty_like(vectors)
   ...:     for k in range(len(vectors)): # just force standard for loop
   ...:         acc[k, :] = vectors[k]
   ...:     return np.linalg.norm(acc, axis=1)
   ...: 

In [3]: def f2(vectors):
   ...:     vectors = np.asarray(vectors, dtype=np.float64)
   ...:     norm = np.empty(len(vectors), dtype=np.float64)
   ...:     for k in range(len(vectors)): # just force standard for loop
   ...:         norm[k] = np.linalg.norm(vectors[k])
   ...:     return norm
   ...: 

In [4]: v = np.random.random((1000, 3))

In [5]: %timeit f1(v)
953 µs ± 16.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [6]: %timeit f2(v)
4.02 ms ± 89.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

因此,似乎该特定测试表明我是对的,并且将所有向量累加到更大的矩阵中并numpy.linalg.norm()对所有向量运行numpy.linalg.norm()效率更高(对于此特定示例而言,效率提高了4倍,向量数等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM