python - 在 Numpy 上优化向量归一化

标签 python numpy vector

我正在尝试使用 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/

相关文章:

python - 如何使用 tkinter 返回 Base 64 编码图形的高度和宽度

python xlrd 将 xlsx 转换为 csv

python - Numpy 的 vstack 是否创建一个新数组 - 它组合的数组的副本?

python - numpy 导入数据的错误形状并分离 y 值

python - 查找二维 numpy 数组中最大和的位置

matlab - 在 3d 中绘制法向量

c++ - 在缓冲区之间移动字节时出现意外结果

python - 将 subprocess.Popen 调用的输出存储在字符串中

python - Pandas 0.23.1属性错误: 'module' object has no attribute 'rolling'

arrays - 查找每个值最后一次出现的索引