我正在尝试使用 numpy 来模拟 N 维空间。请注意,我并不是认真地尝试制作比现有软件更高效的东西,我只是想在这里学习一些东西。
话虽如此,我仍然对设计该算法的最佳方法感到好奇。
空间模拟往往需要大量的归一化计算。
因此,我们假设,要处理 1 秒的模拟,计算机需要进行 100 次归一化计算。
Numpy 能够同时标准化大量向量。我猜测运行 100 个范数的一次计算会比每次运行 1 个范数的 100 次计算要快得多。
保留“要标准化的向量”的全局列表,然后在模拟的每一秒结束时立即处理它们是否有意义?或者这种方法的好处并不明显?
我猜测这取决于与运行计算相关的开销到底有多少。我走在正确的道路上吗?
最佳答案
如果不执行任何计时测试(你绝对应该自己做),我想说,将所有向量累积到一个更大的数组中,然后通过一次调用 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() 会更有效(对于此特定示例,向量数量等为 4 倍)
关于python - 在 Numpy 上优化向量归一化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46986059/