![](/img/trans.png)
[英]Issue in numpy when change numpy array value during vector normalization
[英]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.